maxman
Well-known member
I'm having trouble with dropped rolling grenades after throwing them. That's because when they reach beyond the wall or the Z (min/max) boundary, they disappear invisibly (not killed off; though you can hear an exploding sound).
I tried using tosser and created my own random velocity animation script for moving randomly. But when I tried using tosser to throw grenades laterally against the walls or the boundaries, they never bounce off. Instead, (after landing on the ground) they disappear before making an exploding sound.
tosser:
I created a new script for moving randomly as well trying to stop them from moving beyond boundaries and walls.
Here's an illustration of what I'm trying to achieve from going beyond walls and Z limits.

I don't know how to use checkwall on this. Even I tried using "player_min_z" and "player_max_z" for Z limits, it's still not working. Any clue on how this works?
I tried using tosser and created my own random velocity animation script for moving randomly. But when I tried using tosser to throw grenades laterally against the walls or the boundaries, they never bounce off. Instead, (after landing on the ground) they disappear before making an exploding sound.
Code:
anim freespecial3
delay 6
offset 170 200
frame data/chars/boss03/tossg100.png
frame data/chars/boss03/tossg101.png
delay 15
@cmd tosser "gurenehdoA" 15 41 0 1.5 2 0
frame data/chars/boss03/tossg102.png
delay 6
frame data/chars/boss03/tossg101.png
delay 15
@cmd tosser "gurenehdoA" 15 41 0 1.5 2 -0.2
frame data/chars/boss03/tossg102.png
delay 6
frame data/chars/boss03/tossg101.png
delay 15
@cmd tosser "gurenehdoA" 15 41 0 1.5 2 0.2
frame data/chars/boss03/tossg102.png
delay 6
frame data/chars/boss03/tossg101.png
frame data/chars/boss03/tossg100.png
tosser:
C:
void tosser(void Bomb, float dx, float dy, float dz, float Vx, float Vy, float Vz)
{
void self = getlocalvar("self");
int Direction = getentityproperty(self, "direction");
int x = getentityproperty(self, "x");
int y = getentityproperty(self, "a");
int z = getentityproperty(self, "z");
if (!Direction){
dx=-dx;
}else{}
void Shot = projectile(Bomb, x+dx, z+dz, y+dy, Direction, 0, 1, 0);
changeentityproperty(Shot, "parent", self);
tossentity(Shot, Vy, Vx, Vz);
changeentityproperty(Shot, "speed", Vx);
changeentityproperty(Shot, "hostile", getentityproperty(self, "hostile")+openborconstant("TYPE_RESERVED"));
changeentityproperty(Shot, "candamage", getentityproperty(self, "candamage")+openborconstant("TYPE_RESERVED"));
}
I created a new script for moving randomly as well trying to stop them from moving beyond boundaries and walls.
C:
void randVel(float Vx, float Vz){
//Randomized velocity
void self = getlocalvar("self");
int r = rand()%20;
int x = getentityproperty(self, "x");
int z = getentityproperty(self, "z");
int y = getentityproperty(self, "y");
int zmin = openborvariant("player_min_z");
int zmax = openborvariant("player_max_z");
if(r >= -20 && r <= -17){
changeentityproperty(self, "velocity", -Vx, NULL(), NULL());
}else if(r > -17 && r <= -14){
changeentityproperty(self, "velocity", Vx, NULL(), NULL());
}else if(r > -14 && r <= -11){
changeentityproperty(self, "velocity", NULL(), -Vz, NULL());
}else if(r > -11 && r <= -8){
changeentityproperty(self, "velocity", NULL(), Vz, NULL());
}else if(r > -8 && r <= -5){
changeentityproperty(self, "velocity", -Vx, Vz, NULL());
}else if(r > -5 && r <= -2){
changeentityproperty(self, "velocity", Vx, Vz, NULL());
}else if(r > -2 && r <= 1){
changeentityproperty(self, "velocity", Vx, -Vz, NULL());
}else if(r > 1 && r <= 4){
changeentityproperty(self, "velocity", -Vx, -Vz, NULL());
}
if(z > zmin){
if(r >=4 && r < 7){
changeentityproperty(self, "velocity", NULL(), Vz, NULL());
}else if(r >=7 && r < 10){
changeentityproperty(self, "velocity", -Vx, Vz, NULL());
}else if(r >=10 && r < 13){
changeentityproperty(self, "velocity", Vx, Vz, NULL());
}
}
}
Code:
name gurenehdoA
type npc
subject_to_wall 1
#subject_to_platform 1
#subject_to_obstacle 1
#subject_to_minz 1
#subject_to_maxz 1
shootnum 1
health 1
antigravity 40
speedf 0.9
jumpheight 1
gfxshadow 0
candamage player npc obstacle
nolife 1
noquake 1 1
script data/scripts/bounce2.c
animationscript data/scripts/animation.c
anim idle
loop 0
delay 4
bbox 0
offset 39 70
load gurenehdoB
custentity gurenehdoB
spawnframe 8 0 0 0 0
landframe 8
frame data/chars/misc/bomb/grena01.gif
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
frame data/chars/misc/bomb/grena01.gif
@cmd updateframe getlocalvar("self") 1
frame data/chars/misc/bomb/grena04.gif
delay 1
frame data/chars/misc/empty.gif
@cmd killentity getlocalvar("self")
frame data/chars/misc/empty.gif
Code:
name gurenehdoB
type npc
health 1
speedf 0.9
jumpheight 1
gfxshadow 0
hostile player
candamage player enemy obstacle
nolife 1
aggression 999999
noquake 1 1
subject_to_wall 1
subject_to_platform 1
subject_to_obstacle 1
subject_to_minz 1
subject_to_maxz 1
animationscript data/scripts/animation.c
anim spawn
loop 0
delay 1
bbox 0
offset 39 70
frame data/chars/misc/bomb/grena04.gif
anim idle
@script
void self = getlocalvar("self");
if(frame==0){
changeentityproperty(self, "Subject_to_wall", 1);
}
if(frame==13){
changeentityproperty(self, "Subject_to_Gravity", 0);
}
@end_script
loop 1
delay 4
bbox 0
offset 39 70
frame data/chars/misc/bomb/grena01.gif
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
frame data/chars/misc/bomb/grena01.gif
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
delay 1
@cmd jump001 1 0 0
frame data/chars/misc/bomb/grena06.gif
drawmethod scale 1.25
@cmd velo001 0 0 0
delay 3
sound data/sounds/exp02.wav
frame data/chars/misc/bomb/grex01.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
hitfx data/sounds/exp03.wav
attack22 20 31 41 40 30 1 1 0 8 10
dropv 1.7 2 0
frame data/chars/misc/bomb/grex02.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex03.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex04.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex05.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex06.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex07.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex08.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex09.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex10.gif
@cmd killentity getlocalvar("self")
frame data/chars/misc/empty.gif
anim walk
@script
void self = getlocalvar("self");
if(frame==0){
changeentityproperty(self, "Subject_to_wall", 1);
}
if(frame==19){
changeentityproperty(self, "Subject_to_Gravity", 0);
}
@end_script
loop 1
delay 4
bbox 0
offset 39 70
@cmd performattack getlocalvar("self") openborconstant("ANI_FOLLOW1")
frame data/chars/misc/bomb/grena01.gif
@cmd performattack getlocalvar("self") openborconstant("ANI_FOLLOW1")
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
frame data/chars/misc/bomb/grena01.gif
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
frame data/chars/misc/bomb/grena01.gif
frame data/chars/misc/bomb/grena02.gif
frame data/chars/misc/bomb/grena03.gif
frame data/chars/misc/bomb/grena04.gif
frame data/chars/misc/bomb/grena05.gif
frame data/chars/misc/bomb/grena06.gif
delay 1
@cmd jump001 1 0 0
frame data/chars/misc/bomb/grena06.gif
drawmethod scale 1.25
@cmd velo001 0 0 0
delay 3
sound data/sounds/exp02.wav
frame data/chars/misc/bomb/grex01.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
hitfx data/sounds/exp03.wav
attack22 20 31 41 40 30 1 1 0 8 10
dropv 1.7 2 0
frame data/chars/misc/bomb/grex02.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex03.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex04.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex05.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex06.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex07.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex08.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex09.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex10.gif
@cmd killentity getlocalvar("self")
frame data/chars/misc/empty.gif
anim attack
range -20 20
loop 0
delay 1
bbox 0
offset 39 70
drawmethod scale 1.25
@cmd velo001 0 0 0
sound data/sounds/exp02.wav
frame data/chars/misc/bomb/grex01.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
hitfx data/sounds/exp03.wav
attack22 20 31 41 40 30 1 1 0 8 10
dropv 1.7 2 0
frame data/chars/misc/bomb/grex02.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex03.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex04.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex05.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex06.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex07.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex08.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex09.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex10.gif
@cmd killentity getlocalvar("self")
frame data/chars/misc/empty.gif
anim follow1
@script
void self = getlocalvar("self");
int y = getentityproperty(self, "y");
if(frame==0){
changeentityproperty(self, "Subject_to_wall", 1);
changeentityproperty(self, "position", NULL(), NULL(), y+0);
}
if(frame==20){
changeentityproperty(self, "Subject_to_Gravity", 0);
}
@end_script
loop 1
delay 4
bbox 0
offset 39 70
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena01.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena02.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena03.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena04.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena05.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena06.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena01.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena02.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena03.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena04.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena05.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena06.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena01.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena02.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena03.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena04.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena05.gif
@cmd randVel 0.25 0.25
frame data/chars/misc/bomb/grena06.gif
@cmd stop
delay 1
frame data/chars/misc/bomb/grena06.gif
@cmd jump001 1 0 0
frame data/chars/misc/bomb/grena06.gif
drawmethod scale 1.25
@cmd velo001 0 0 0
delay 3
sound data/sounds/exp02.wav
frame data/chars/misc/bomb/grex01.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
hitfx data/sounds/exp03.wav
attack22 20 31 41 40 30 1 1 0 8 10
dropv 1.7 2 0
frame data/chars/misc/bomb/grex02.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex03.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex04.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex05.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex06.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex07.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex08.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex09.gif
delay 1
frame data/chars/misc/empty.gif
delay 3
frame data/chars/misc/bomb/grex10.gif
@cmd killentity getlocalvar("self")
frame data/chars/misc/empty.gif
Here's an illustration of what I'm trying to achieve from going beyond walls and Z limits.

I don't know how to use checkwall on this. Even I tried using "player_min_z" and "player_max_z" for Z limits, it's still not working. Any clue on how this works?