Grenade: Difference between revisions
(Created page with "@everyoneDo you want to make some kind of grenades in your game? I've got you here pal! Put these lines of code into your loop_script: //BOMB THROWING LOGIC player check rotation rotx roty degtorad=$roty degtorad-=45 degtorad*=0.034906585 global.bombthrowy=SIN($degtorad) global.bombthrowx=COS($degtorad) global.bombthrowx*=-15 global.bombthrowy*=-15 degtorad=$roty degtorad*=0.0174532925 fixbty=SIN($degtorad) global.bombthrowy+=$fixbty degtorad=$rotx degtor...") |
mNo edit summary |
||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
Created by Мужик с Чашкой | |||
Do you want to make some kind of grenades in your game? I've got you here pal! | |||
Put these lines of code into your loop_script: | Put these lines of code into your loop_script: | ||
<pre> | |||
//BOMB THROWING LOGIC | //BOMB THROWING LOGIC | ||
player check rotation rotx roty | player check rotation rotx roty | ||
degtorad=$roty | degtorad=$roty | ||
degtorad-=45 | degtorad-=45 | ||
degtorad*=0.034906585 | degtorad*=0.034906585 | ||
global.bombthrowy=SIN($degtorad) | global.bombthrowy=SIN($degtorad) | ||
global.bombthrowx=COS($degtorad) | global.bombthrowx=COS($degtorad) | ||
global.bombthrowx*=-15 | global.bombthrowx*=-15 | ||
global.bombthrowy*=-15 | global.bombthrowy*=-15 | ||
degtorad=$roty | degtorad=$roty | ||
degtorad*=0.0174532925 | degtorad*=0.0174532925 | ||
fixbty=SIN($degtorad) | fixbty=SIN($degtorad) | ||
global.bombthrowy+=$fixbty | global.bombthrowy+=$fixbty | ||
degtorad=$rotx | degtorad=$rotx | ||
degtorad*=0.0174532925 | degtorad*=0.0174532925 | ||
global.bombthrowf=SIN($degtorad) | global.bombthrowf=SIN($degtorad) | ||
global.bombthrowf*=350 | global.bombthrowf*=350 | ||
global.bombthrowv=COS($degtorad) | global.bombthrowv=COS($degtorad) | ||
global.bombthrowv*=-350 | global.bombthrowv*=-350 | ||
global.bombthrowv+=80 | global.bombthrowv+=80 | ||
global.bombthrowz=COS($degtorad) | global.bombthrowz=COS($degtorad) | ||
global.bombthrowz*=-21 | global.bombthrowz*=-21 | ||
global.bombthrowz+=21 | global.bombthrowz+=21 | ||
</pre> | |||
21 = player height divided by 2. | 21 = player height divided by 2. | ||
15 = player radius minus one plus grenade radius (works best when it's zero). | 15 = player radius minus one plus grenade radius (works best when it's zero). | ||
350 = throw force. | 350 = throw force. | ||
Use this frame into FSM: | Use this frame into FSM: | ||
<pre> | |||
frame 0 0.01 0 0 0 SPAWN fbombprj $global.bombthrowx,$global.bombthrowz,$global.bombthrowy $global.bombthrowf,$global.bombthrowv | frame 0 0.01 0 0 0 SPAWN fbombprj $global.bombthrowx,$global.bombthrowz,$global.bombthrowy $global.bombthrowf,$global.bombthrowv | ||
</pre> | |||
"fbombprj" - is an enemy with zero radius that does nothing and act as a throwable object, since [[decorations]] don't have any physics. | "fbombprj" - is an enemy with zero radius that does nothing and act as a throwable object, since [[decorations]] don't have any physics. | ||
Line 64: | Line 48: | ||
Cons: To prevent spawning things through walls when you stand next to them, we have to spawn things one unit inside player's radius. It pushes back a little, barely noticeable while in movement. But if you make your projectile radius bigger that zero - pushback is much more noticable. By tweaking the 15 number - you can increase the pushback even more without changing the projectile radius. | Cons: To prevent spawning things through walls when you stand next to them, we have to spawn things one unit inside player's radius. It pushes back a little, barely noticeable while in movement. But if you make your projectile radius bigger that zero - pushback is much more noticable. By tweaking the 15 number - you can increase the pushback even more without changing the projectile radius. | ||
Here's a FSM for your grenade if you want to make it explode by touching walls/floors. Don't forget to include DEATH/DEAD states: | |||
<pre> | |||
state IDLE ROLL 0 | |||
frame 0 0.0 0 0 0 NONE | |||
frame 0 0.0 0 0 0 SETVAR timer -1 | |||
frame 0 0.01 0 0 0 READY | |||
state ROLL SROLL 0 | |||
frame 0 0.0 0 0 0 NONE | |||
frame 0 0.02 0 0 0 CHECKPOS newX newY newZ | |||
frame 0 0.0 0 0 0 INCREMENT newZ 0.001 | |||
frame 0 0.0 0 0 0 DECREMENT newX $oldX | |||
frame 0 0.0 0 0 0 DECREMENT newY $oldY | |||
frame 0 0.0 0 0 0 DECREMENT newZ $oldZ | |||
frame 0 0.0 0 0 0 DIVIDE newX $newY | |||
frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ | |||
frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 | |||
frame 0 0.0 0 0 0 INCREMENT timer 1 | |||
frame 0 0.0 0 0 0 JUMPIFLESS timer 1 ROLL | |||
frame 0 0.0 0 0 0 INCREMENT TRatio $newX | |||
frame 0 0.0 0 0 0 SETVAR MRatio $TRatio | |||
frame 0 0.0 0 0 0 DIVIDE MRatio $timer | |||
frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio | |||
frame 0 0.0 0 0 0 JUMPIFGREATER timer 2 ROLL | |||
frame 0 0.0 0 0 0 SETVAR CRatio $MRatio | |||
frame 0 0.0 0 0 0 SETVAR MaxRatio $CRatio | |||
frame 0 0.0 0 0 0 SETVAR MinRatio $CRatio | |||
frame 0 0.0 0 0 0 MULTIPLY MaxRatio 1.01 | |||
frame 0 0.0 0 0 0 MULTIPLY MinRatio 0.99 | |||
frame 0 0.0 0 0 0 JUMPIFGREATER CRatio 100000 MAXROLL | |||
frame 0 0.0 0 0 0 JUMPIFLESS CRatio 0.001 MINROLL | |||
state SROLL NONE 0 | |||
frame 0 0.00 0 0 0 NONE | |||
frame 0 0.02 0 0 0 CHECKPOS newX newY newZ | |||
frame 0 0.0 0 0 0 INCREMENT newZ 0.001 | |||
frame 0 0.0 0 0 0 DECREMENT newX $oldX | |||
frame 0 0.0 0 0 0 DECREMENT newY $oldY | |||
frame 0 0.0 0 0 0 DECREMENT newZ $oldZ | |||
frame 0 0.0 0 0 0 DIVIDE newX $newY | |||
frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ | |||
frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 | |||
frame 0 0.0 0 0 0 INCREMENT timer 1 | |||
frame 0 0.0 0 0 0 INCREMENT TRatio $newX | |||
frame 0 0.0 0 0 0 SETVAR MRatio $TRatio | |||
frame 0 0.0 0 0 0 DIVIDE MRatio $timer | |||
frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio | |||
frame 0 0.0 0 0 0 JUMPIFGREATER MRatio $MaxRatio DEATH | |||
frame 0 0.0 0 0 0 JUMPIFLESS MRatio $MinRatio DEATH | |||
frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH | |||
state MAXROLL NONE 0 | |||
frame 0 0.00 0 0 0 NONE | |||
frame 0 0.02 0 0 0 CHECKPOS newX newY newZ | |||
frame 0 0.0 0 0 0 INCREMENT newZ 0.001 | |||
frame 0 0.0 0 0 0 DECREMENT newX $oldX | |||
frame 0 0.0 0 0 0 DECREMENT newY $oldY | |||
frame 0 0.0 0 0 0 DECREMENT newZ $oldZ | |||
frame 0 0.0 0 0 0 DIVIDE newX $newY | |||
frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ | |||
frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 | |||
frame 0 0.0 0 0 0 INCREMENT timer 1 | |||
frame 0 0.0 0 0 0 SETVAR MRatio $newX | |||
frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio | |||
frame 0 0.0 0 0 0 JUMPIFLESS MRatio 100000 DEATH | |||
frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH | |||
state MINROLL NONE 0 | |||
frame 0 0.00 0 0 0 NONE | |||
frame 0 0.02 0 0 0 CHECKPOS newX newY newZ | |||
frame 0 0.0 0 0 0 INCREMENT newZ 0.001 | |||
frame 0 0.0 0 0 0 DECREMENT newX $oldX | |||
frame 0 0.0 0 0 0 DECREMENT newY $oldY | |||
frame 0 0.0 0 0 0 DECREMENT newZ $oldZ | |||
frame 0 0.0 0 0 0 DIVIDE newX $newY | |||
frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ | |||
frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 | |||
frame 0 0.0 0 0 0 SETVAR MRatio $newX | |||
frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio | |||
frame 0 0.0 0 0 0 JUMPIFGREATER MRatio 0.001 DEATH | |||
frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH | |||
</pre> |
Latest revision as of 14:28, 25 July 2025
Created by Мужик с Чашкой
Do you want to make some kind of grenades in your game? I've got you here pal!
Put these lines of code into your loop_script:
//BOMB THROWING LOGIC player check rotation rotx roty degtorad=$roty degtorad-=45 degtorad*=0.034906585 global.bombthrowy=SIN($degtorad) global.bombthrowx=COS($degtorad) global.bombthrowx*=-15 global.bombthrowy*=-15 degtorad=$roty degtorad*=0.0174532925 fixbty=SIN($degtorad) global.bombthrowy+=$fixbty degtorad=$rotx degtorad*=0.0174532925 global.bombthrowf=SIN($degtorad) global.bombthrowf*=350 global.bombthrowv=COS($degtorad) global.bombthrowv*=-350 global.bombthrowv+=80 global.bombthrowz=COS($degtorad) global.bombthrowz*=-21 global.bombthrowz+=21
21 = player height divided by 2. 15 = player radius minus one plus grenade radius (works best when it's zero). 350 = throw force.
Use this frame into FSM:
frame 0 0.01 0 0 0 SPAWN fbombprj $global.bombthrowx,$global.bombthrowz,$global.bombthrowy $global.bombthrowf,$global.bombthrowv
"fbombprj" - is an enemy with zero radius that does nothing and act as a throwable object, since decorations don't have any physics.
Pros: Now you have a means of throwing stuff. It even takes into account if you look up or down.
Cons: To prevent spawning things through walls when you stand next to them, we have to spawn things one unit inside player's radius. It pushes back a little, barely noticeable while in movement. But if you make your projectile radius bigger that zero - pushback is much more noticable. By tweaking the 15 number - you can increase the pushback even more without changing the projectile radius.
Here's a FSM for your grenade if you want to make it explode by touching walls/floors. Don't forget to include DEATH/DEAD states:
state IDLE ROLL 0 frame 0 0.0 0 0 0 NONE frame 0 0.0 0 0 0 SETVAR timer -1 frame 0 0.01 0 0 0 READY state ROLL SROLL 0 frame 0 0.0 0 0 0 NONE frame 0 0.02 0 0 0 CHECKPOS newX newY newZ frame 0 0.0 0 0 0 INCREMENT newZ 0.001 frame 0 0.0 0 0 0 DECREMENT newX $oldX frame 0 0.0 0 0 0 DECREMENT newY $oldY frame 0 0.0 0 0 0 DECREMENT newZ $oldZ frame 0 0.0 0 0 0 DIVIDE newX $newY frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 frame 0 0.0 0 0 0 INCREMENT timer 1 frame 0 0.0 0 0 0 JUMPIFLESS timer 1 ROLL frame 0 0.0 0 0 0 INCREMENT TRatio $newX frame 0 0.0 0 0 0 SETVAR MRatio $TRatio frame 0 0.0 0 0 0 DIVIDE MRatio $timer frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio frame 0 0.0 0 0 0 JUMPIFGREATER timer 2 ROLL frame 0 0.0 0 0 0 SETVAR CRatio $MRatio frame 0 0.0 0 0 0 SETVAR MaxRatio $CRatio frame 0 0.0 0 0 0 SETVAR MinRatio $CRatio frame 0 0.0 0 0 0 MULTIPLY MaxRatio 1.01 frame 0 0.0 0 0 0 MULTIPLY MinRatio 0.99 frame 0 0.0 0 0 0 JUMPIFGREATER CRatio 100000 MAXROLL frame 0 0.0 0 0 0 JUMPIFLESS CRatio 0.001 MINROLL state SROLL NONE 0 frame 0 0.00 0 0 0 NONE frame 0 0.02 0 0 0 CHECKPOS newX newY newZ frame 0 0.0 0 0 0 INCREMENT newZ 0.001 frame 0 0.0 0 0 0 DECREMENT newX $oldX frame 0 0.0 0 0 0 DECREMENT newY $oldY frame 0 0.0 0 0 0 DECREMENT newZ $oldZ frame 0 0.0 0 0 0 DIVIDE newX $newY frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 frame 0 0.0 0 0 0 INCREMENT timer 1 frame 0 0.0 0 0 0 INCREMENT TRatio $newX frame 0 0.0 0 0 0 SETVAR MRatio $TRatio frame 0 0.0 0 0 0 DIVIDE MRatio $timer frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio frame 0 0.0 0 0 0 JUMPIFGREATER MRatio $MaxRatio DEATH frame 0 0.0 0 0 0 JUMPIFLESS MRatio $MinRatio DEATH frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH state MAXROLL NONE 0 frame 0 0.00 0 0 0 NONE frame 0 0.02 0 0 0 CHECKPOS newX newY newZ frame 0 0.0 0 0 0 INCREMENT newZ 0.001 frame 0 0.0 0 0 0 DECREMENT newX $oldX frame 0 0.0 0 0 0 DECREMENT newY $oldY frame 0 0.0 0 0 0 DECREMENT newZ $oldZ frame 0 0.0 0 0 0 DIVIDE newX $newY frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 frame 0 0.0 0 0 0 INCREMENT timer 1 frame 0 0.0 0 0 0 SETVAR MRatio $newX frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio frame 0 0.0 0 0 0 JUMPIFLESS MRatio 100000 DEATH frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH state MINROLL NONE 0 frame 0 0.00 0 0 0 NONE frame 0 0.02 0 0 0 CHECKPOS newX newY newZ frame 0 0.0 0 0 0 INCREMENT newZ 0.001 frame 0 0.0 0 0 0 DECREMENT newX $oldX frame 0 0.0 0 0 0 DECREMENT newY $oldY frame 0 0.0 0 0 0 DECREMENT newZ $oldZ frame 0 0.0 0 0 0 DIVIDE newX $newY frame 0 0.02 0 0 0 CHECKPOS oldX oldY oldZ frame 0 0.0 0 0 0 INCREMENT oldZ 0.001 frame 0 0.0 0 0 0 SETVAR MRatio $newX frame 0 0.0 0 0 0 MULTIPLY MRatio $MRatio frame 0 0.0 0 0 0 JUMPIFGREATER MRatio 0.001 DEATH frame 0 0.0 0 0 0 JUMPIFEQUALS newZ 0 DEATH