ja es passiert cleintside aber die e2 funktion geht nur serverside
ja es passiert cleintside aber die e2 funktion geht nur serverside
Ich habe ein schwebendes, sich drehendes Sägeblatt gebaut.
Später soll es dann auch noch NPCs angreifen, aber das kommt noch.
Wie schaffe ich es, dass ich die rotationsgeschwindigkeit begrenze?
Es rotiert immer schneller und irgendwann verlässt der E2 chip dann das Sägeblatt.
applyTorque kleiner machen bringt nichts, dann dauert es nur länger bis es passiert.
http://www.wegame.com/watch/sawblade-problem/
PHP-Code:
@name SawBlade
@inputs
@outputs
@persist Entity:entity
@trigger
runOnTick(1)
findByModel("models/props_junk/sawblade001a.mdl")
Entity = findClosest(entity():pos())
Entity:applyTorque(vec(0,0,-10) * Entity:mass())
Entity:applyForce(vec(0,0,9) * Entity:mass())
entity():applyTorque(vec(0,0,-10) * entity():mass())
entity():applyForce(vec(0,0,9) * entity():mass())
# by Clarity
-gelöscht, habe die 6. Seite übersehen-
Lass die Scheibe nur beschleinigen, wenn sie zu langsam ist:
PHP-Code:
if(Entity:angVel():yaw() < 1000) {
Entity:applyTorque(vec(0,0,-10) * Entity:mass())
} else {
Entity:applyAngForce(-Entity:angVel()*10) # Bremst das Prop, ist aber vielleicht nicht unbedingt nötig.
}
Was mir noch auffällt: Du lässt jeden Tick das Sägeblatt suchen. Die find-funktionen sind recht rechenintensiv, deswegen wäre es besser, das du nur einmal danach suchst, und es dann speicherst.
PHP-Code:
if(!Entity & findCanQuery()) {
findByModel("models/props_junk/sawblade001a.mdl")
Entity = findClosest(entity():pos())
}
Erstmal danke für den Tipp mit findByModel, wusste ich gar nicht, dass das besonders rechenintensiv ist,
zudem blieben meine fps (bisher) immer realativ konstant.
Die Scheibe zu bremsen funktioniert allerdings noch nicht so richtig, selbst mit der else Bedingung.
Ich habe auch schon if(Entity:angVel():yaw() < 10) eingesetzt. Selbst da verlässt der Chip noch zeitweise
die Scheibe.
Sehe ich das richtig, Entity:angVel() gibt die Winkelgeschwindigkeit des Entities als "WinkelVektor" (Angle) zurück. Die Funktion yaw() sorgt dafür, dass nur der winkel in der horizontalen Ebene genommen wird?
Edit:
Problem gelöst! Die Scheibe wird ja mit einem negativen Drehmoment beschleunigt, also ist auch yaw negativ.
Die if-Bedingung muss dann also so lauten: if(Entity:angVel():yaw() > -1000)
Geändert von Clarity (30.12.2009 um 17:38 Uhr)
Es gibt die Convars wire_exp2_entFindRate und wire_exp2_playerFindRate, womit man einstellt, wie oft gesucht werden kann. Mit findCanQuery() kann man gucken, ob man gerade suchen "darf".
Genau
Ups, dass hatte ich übersehen. Aber du hast es ja selber rausgefunden![]()
Jetzt hänge ich an meinem nächsten Problem...
Ich will, dass das Sägeblatt horizontal stabilisiert wird,
aber ich bekomme das nicht hin. Ich habe schon fertige E2s gefunden, die es komplett
Winkelstabilisieren, aber das will ich ja nicht, es soll sich ja noch um die eigene Achse drehen.
zB das hier:
http://wiki.garrysmod.com/?title=Wir...8by_chinoto.29PHP-Code:
@name Force Test
runOnTick(1)
Temp=entity(),Entity=(Temp:getConstraints():count() > 0 ? Temp:isWeldedTo() : Temp)
Angle=-Entity:angles()*15-Entity:angVel()*2
Center=Entity:massCenter(),Right=Entity:right(),Forward=Entity:forward(),Up=Entity:up()
Entity:applyForce((vec(0,0,9.015)-Entity:vel())*Entity:mass())
Leverage=Entity:inertia():length()
Entity:applyOffsetForce( Up *Angle:pitch(),Center-Forward*Leverage)
Entity:applyOffsetForce(-Up *Angle:pitch(),Center+Forward*Leverage)
Entity:applyOffsetForce( Right*Angle:yaw() ,Center-Forward*Leverage) # will ich nicht
Entity:applyOffsetForce(-Right*Angle:yaw() ,Center+Forward*Leverage) # und das auch nicht
Entity:applyOffsetForce( Up *Angle:roll() ,Center-Right *Leverage)
Entity:applyOffsetForce(-Up *Angle:roll() ,Center+Right *Leverage)
#Entity:applyAngForce(Angle*Leverage) #This can replace the above 6 lines
Wenn ich jetzt die zwei zeilen die ich nicht brauche auskommentiere, dann dreht es sich zwar wieder,
aber es ist absolut nicht mehr stabil in roll und pitch...
Ist es überhaupt möglich, nur in pitch und roll zu stabilisieren, oder geht das nur, wenn ich auch yaw stabilisiere?
(Mein alternativplan wäre es, das Sägeblatt über eine Axis mit einer kleinen komplett stabilisierten Platte zu verbinden. Aber diese Lösung fände ich nicht so schön, wie wenn alles in einem Chip geht.)
Ich hab gerade was gebastelt. Sägeblatt spawnen und per Entity-Marker mit dem E2 verbinden. Das Sägeblatt schwebt 100 units über der E2, Pitch und Roll werden gehalten und es dreht sich.
Es gibt mehrere Wege das zu realisieren, dass hier ist nur einerPHP-Code:
@name
@inputs E:entity
@outputs
@persist
@trigger
runOnTick( 1 )
To = entity():pos() + vec( 0, 0, 100 )
V = ( To - E:pos() - E:vel() ) * E:mass()
A = ( -E:angles() - E:angVel() ):setYaw( 0 ) * E:mass()
R = ang( 0, 1000, 0 )
E:applyForce( V )
E:applyAngForce( A )
if( E:angVel():yaw() < 1000 ) {
E:applyAngForce( R )
}
![]()
Hey danke,
das ist zwar noch nicht genau das was ich brauche,
aber wenn ich das verstanden habe wird es mir weiterhelfen denke ich.
PS: Was meinst du mit dem "Entity-Marker"? Ich habs mit dem Wire Tool verbunden...
Spoiler:Mein bisheriger Stand noch ohne Stabilisierung
Edit:
Bei dem Versuch, die Drehzahl bei deinem E2 zu erhöhen, war es auf einmal nicht mehr stabil.
Das brachte mich auf die Idee, die Drehzahl bei meinem zu verringern, jetzt läuft auch meines stabil.![]()
Geändert von Clarity (30.12.2009 um 21:22 Uhr)