Physiker Posted May 25, 2011 Share Posted May 25, 2011 HiI want to make a script to kick a ball, or shoot on target in soccer. I know it's simple, I tried it but it doesn't work. It seems to apply the impulse, but after that the ball suddenly returns to it's original position. I used the function llApplyImpulse(<5,0,0>,TRUE);Can you help me what's wrong, or post a working script? Thank you. Link to comment Share on other sites More sharing options...
Darkie Minotaur Posted May 25, 2011 Share Posted May 25, 2011 llApplyImpulse as such doesn't have that effect - if you published your complete script here, it would be easier Link to comment Share on other sites More sharing options...
Innula Zenovka Posted May 25, 2011 Share Posted May 25, 2011 As Darkie says, it sounds like something else in your script that's causing the problems. Here's a very basic script that works for me -- just tested it: default { state_entry () { llSetStatus (STATUS_PHYSICS, TRUE); // make sure that Physical is turned on } collision_start (integer total_number) { llSay (0, "Collided with "+llDetectedName (0)); llApplyImpulse (<2, 0, 0>, FALSE); }} ETA -- there's a tutorial on making a kickable ball at http://www.ibm.com/developerworks/rational/tutorials/r-radsl/section3.html (the first two sections you can skip -- it's all about how to install Eclipse and stuff -- and the interesting stuff starts at that link). Link to comment Share on other sites More sharing options...
Physiker Posted May 25, 2011 Author Share Posted May 25, 2011 integer communicationChannel = 7779;vector direction;default{ state_entry() { llOwnerSay("running"); llSetRemoteScriptAccessPin(69); llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE); llSetStatus(STATUS_PHYSICS, TRUE); llListen(communicationChannel, "", NULL_KEY, "shoot"); llSensorRepeat("",NULL_KEY,AGENT,1.5,2*PI,.5); //check whether the ball is close } sensor(integer total_number) { vector pos = llDetectedPos(0); vector unit = <1,0,0>; vector offset; offset=(unit * llDetectedRot(0)); //rotate vector unit pos+=offset; direction=offset*6; //set direction of the kick in the bottom llMoveToTarget(pos,.1); } listen(integer channel, string name, key id, string message) { llOwnerSay("now shooting"); llApplyImpulse(direction,TRUE); //kick the ball }} If if I'm not in posession (futher away than 1,5 meters), I try to kick it, the ball moves, but goes back to it's original place, it shouldn't do that as I'm far away, so the event sensor doesn't get triggered. What's the problem with this scipt? Link to comment Share on other sites More sharing options...
Darkie Minotaur Posted May 25, 2011 Share Posted May 25, 2011 Of couse it does - it still gets your command and the listener receives it - you just don't set the new 'direction' since the sensor doesn't get triggered. To avoid this, you could introduce a global integer which gets set to true if there is an Agent close by. The listeners only kicks the ball if the global is true. if no_sensor is fired, set the globalö to false. Another maybe more elegant way would be to check the distance in the listener before kicking. Link to comment Share on other sites More sharing options...
Innula Zenovka Posted May 25, 2011 Share Posted May 25, 2011 One problem, which would certainly account for the ball's returning to the start position, is that the original target doesn't get removed properly. Take a look at llTarget(), at_target() and llTargetRemove() Link to comment Share on other sites More sharing options...
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now