aboutsummaryrefslogtreecommitdiff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2021-06-22 16:41:56 +0700
committerNguyễn Gia Phong <mcsinyx@disroot.org>2021-06-22 16:41:56 +0700
commit93c57836fbaf6a1329f536ab9d1919f97a58de8f (patch)
tree41cfbe34852975c718887130bc2fe1b3d39297e9 /src/GameTick.cpp
parentf0d05c8ec8548a00bd9ff3fb76f0c8bc785e2299 (diff)
downloadblackshades-93c57836fbaf6a1329f536ab9d1919f97a58de8f.tar.gz
Fix out of bound index and clean up
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r--src/GameTick.cpp481
1 files changed, 3 insertions, 478 deletions
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index 3350634..5cd11b8 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -874,25 +874,17 @@ void Game::Tick(){
}
//Camera
-
camera.oldposition=camera.position;
-
camera.targetoffset=0;
-
camera.targetoffset.z=-5;
//Spawn people
-
spawndelay-=multiplier;
-
int blockspawnx,blockspawny;
-
blockspawnx=0;
-
blockspawny=0;
int cyclenum;
-
cyclenum=0;
while((citypeoplenum[blockspawnx][blockspawny]>=max_people_block&&cyclenum<10)||blockspawnx==0){
@@ -1150,71 +1142,43 @@ void Game::Tick(){
}}
XYZ towards;
-
XYZ finaltarget;
-
XYZ blah;
-
int closesttarget = 0;
-
float leastdistance = 0.0;
-
XYZ bleedloc;
-
XYZ vel;
-
float tooclose;
-
float toofar;
//People
-
for(int i=0;i<numpeople;i++){
-
if(person[i].health<0&&person[i].longdead<0&&person[i].firstlongdead==0){
-
if(person[i].type!=zombietype){
-
overpoint=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
-
overpoint.y+=3000;
-
underpoint=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
-
underpoint.y-=3000;
move=0;
-
move.x=person[i].whichblockx*block_spacing;
-
move.z=person[i].whichblocky*block_spacing;
XYZ temp;
-
whichtri=sidewalkcollide.LineCheck2(overpoint,underpoint,&temp,move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
XYZ normish;
-
normish=0;
-
normish.y=1;
if(whichtri>=0){
-
decals.MakeDecal(bloodpool,temp,12,normish, whichtri, &sidewalkcollide, move, cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
-
}
-
if(whichtri==-1){
-
temp=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
-
temp.y=-.5;
-
move=0;
-
decals.MakeDecal(bloodpool,temp,12,normish, 0, &sidewalkcollide, move, 0);
-
}
person[i].firstlongdead=1;
@@ -1224,205 +1188,126 @@ void Game::Tick(){
}
if(person[i].health<100&&person[i].type!=zombietype){
-
person[i].health-=multiplier*120;
-
}
if(person[i].health<100&&person[i].type==zombietype){
-
person[i].health+=multiplier*10;
-
if(person[i].health>person[i].maxhealth)person[i].health=person[i].maxhealth;
-
}
if(person[i].health<100&&person[i].type==zombietype&&person[i].skeleton.free==1){
-
person[i].health+=multiplier*10;
-
if(person[i].health>person[i].maxhealth)person[i].health=person[i].maxhealth;
-
}
if(person[i].health<40&&person[i].type==zombietype){
-
person[i].speedmult-=multiplier/20;
-
if(person[i].speedmult<.6){
-
person[i].speedmult=.6;
-
person[i].killtarget=-1;
-
}
-
}
if(person[i].health>=40&&person[i].type==zombietype){
-
person[i].speedmult+=multiplier/40;
-
if(person[i].speedmult>.7+difficulty*.2){
-
person[i].speedmult=.7+difficulty*.2;
-
person[i].killtarget=1;
-
}
-
}
if(person[i].maxhealth<100&&person[i].type==zombietype){
-
person[i].maxhealth+=multiplier*2;
-
if(person[i].maxhealth>100)person[i].maxhealth=100;
-
}
if(person[i].bleeding>0){
-
person[i].bleeding-=multiplier;
-
person[i].bleeddelay-=multiplier*10;
-
if(person[i].bleeddelay<=0){
-
person[i].bleeddelay=1;
-
if(person[i].skeleton.free==0){
-
bleedloc=DoRotation((person[i].bjoint1->position+person[i].bjoint2->position)/2,0,person[i].playerrotation,0)+person[i].playercoords;
-
}
-
if(person[i].skeleton.free>0){
-
bleedloc=(person[i].bjoint1->position+person[i].bjoint2->position)/2;
-
}
-
vel=0;
-
sprites.MakeSprite(bloodspritedown, .6, 1, .2, .2,bleedloc, vel, 3*person[i].bleeding);
-
}
}
if(person[i].skeleton.free==0){
-
//Gun
-
if(person[i].type==playertype||person[i].type==eviltype){
-
if(i==0){
-
if(person[i].whichgun==shotgun)person[i].recoil-=multiplier*4;
-
if(person[i].whichgun==sniperrifle)person[i].recoil-=multiplier*2;
-
if(person[i].whichgun==handgun1)person[i].recoil-=multiplier*5;
-
if(person[i].whichgun==handgun2)person[i].recoil-=multiplier*5;
-
if(person[i].whichgun==assaultrifle)person[i].recoil-=multiplier*10;
-
}
if(i!=0){
-
if(person[i].whichgun==shotgun)person[i].recoil-=multiplier*1;
-
if(person[i].whichgun==sniperrifle)person[i].recoil-=multiplier*1;
-
if(person[i].whichgun==handgun1)person[i].recoil-=multiplier*2;
-
if(person[i].whichgun==handgun2)person[i].recoil-=multiplier*2;
-
if(person[i].whichgun==assaultrifle)person[i].recoil-=multiplier*10;
-
}
if(person[i].recoil<0)person[i].recoil=0;
if(i==0){
-
if(zoom){
-
mousesensitivity=.05*usermousesensitivity;
-
if(person[i].targetanimation!=crouchanim||person[i].currentanimation!=crouchanim||person[i].aiming<1){
-
zoom=0;
-
}
-
if(visions==1)zoom=0;
-
}
if(person[i].currentanimation==crouchanim&&person[i].targetanimation==crouchanim&&person[i].aiming>=1&&person[i].whichgun==sniperrifle){
-
zoom=1;
-
if(zoom&&!oldzoom)camera.rotation2-=6;
-
}
if(!zoom)mousesensitivity=1*usermousesensitivity;
if(person[i].whichgun!=sniperrifle)zoom=0;
-
}
-
}
//Zombie eat
-
- if(i>0&&person[person[i].killtarget].eaten==i&&person[i].targetanimation==zombieeatanim){
-
+ if(i > 0
+ && person[i].targetanimation == zombieeatanim
+ && person[person[i].killtarget].eaten == i) {
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].locked=1;
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].locked=1;
for(int k=0;k<2;k++){
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].position=DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[righthand]].position,0,person[i].playerrotation,0)+person[i].playercoords;
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].velocity=0;
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].position=DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[lefthand]].position,0,person[i].playerrotation,0)+person[i].playercoords;
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].velocity=0;
-
person[person[i].killtarget].skeleton.DoConstraints();
-
person[person[i].killtarget].skeleton.DoConstraints(&blocksimplecollide[citytype[person[i].whichblockx][person[i].whichblocky]],&move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
-
}
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].locked=0;
-
person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].locked=0;
-
person[person[i].killtarget].longdead=1;
-
}
if(i>0&&enemystate!=1&&person[i].type==zombietype&&person[i].speedmult>.7){
-
if(findDistancefast(person[i].playercoords,person[1].playercoords)<20000)person[i].killtarget=1;
-
else person[i].killtarget=-1;
-
}
if(i>0&&enemystate!=1&&person[i].type==zombietype&&person[i].speedmult<.7){
-
person[i].killtarget=-1;
-
}
bool realcheck = false;
@@ -1439,395 +1324,228 @@ void Game::Tick(){
||findDistancefast(person[i].playercoords,person[i].pathtarget)>findDistancefast(person[i].oldplayercoords,person[i].pathtarget);
if(person[i].targetanimation==idleanim&&person[i].killtargetvisible==0){
-
person[i].targetanimation=walkanim;
-
if(person[i].type==zombietype)person[i].targetanimation=zombiewalkanim;
-
realcheck=1;
-
}
if((realcheck||((person[i].killtarget>-1&&person[i].type!=civiliantype)&&person[i].pathcheckdelay<=0)||person[i].killtargetvisible)){
-
person[i].pathcheckdelay=1.2;
if((person[i].killtarget==-1||person[i].type==civiliantype)&&!person[i].running){
-
person[i].killtargetvisible=0;
-
leastdistance=2000000;
-
for(int j=0;j<path.vertexNum;j++){
-
person[i].pathtarget.x=path.vertex[j].x;
-
person[i].pathtarget.z=path.vertex[j].z;
-
person[i].pathtarget.y=path.vertex[j].y;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
-
person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&j!=1&&j!=person[i].oldpathnum&&j!=person[i].oldoldpathnum&&j!=person[i].oldoldoldpathnum){
-
leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-
closesttarget=j;
-
}
-
}
if(closesttarget>=0&&closesttarget<path.vertexNum){
-
person[i].oldoldoldpathnum=person[i].oldoldpathnum;
-
person[i].oldoldpathnum=person[i].oldpathnum;
-
person[i].oldpathnum=person[i].pathnum;
-
person[i].pathnum=closesttarget;
-
person[i].pathtarget.x=path.vertex[person[i].pathnum].x;
-
person[i].pathtarget.z=path.vertex[person[i].pathnum].z;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
-
person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
-
}
-
}
if(person[i].running&&realcheck){
-
person[i].killtargetvisible=0;
-
person[i].targetanimation=joganim;
//Dead target?
-
if(person[person[i].killtarget].health<=0){
-
person[i].running=0;
-
}
person[i].killtarget=1;
//If pathfind
-
if(realcheck){
-
leastdistance=2000000;
-
person[i].lastdistancevictim=0;
-
closesttarget=-1;
//Check best path
-
closesttarget=person[i].pathnum;
//Check other blocks?
-
if ((closesttarget==person[i].pathnum)){
-
beginx=person[i].whichblockx-2;
-
if(beginx<0)beginx=0;
-
beginz=person[i].whichblocky-2;
-
if(beginz<0)beginz=0;
-
endx=person[i].whichblockx+2;
-
if(endx>num_blocks-1)endx=num_blocks-1;
-
endz=person[i].whichblocky+2;
-
if(endz>num_blocks-1)endz=num_blocks-1;
-
leastdistance=2000000;
for(int l=beginx;l<=endx;l++){
-
for(int m=beginx;m<=endx;m++){
-
for(int j=0;j<path.vertexNum;j++){
-
person[i].pathtarget.x=path.vertex[j].x;
-
person[i].pathtarget.y=path.vertex[j].y;
-
person[i].pathtarget.z=path.vertex[j].z;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=l*block_spacing;
-
person[i].pathtarget.z+=m*block_spacing;
if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)>findDistancefast(person[i].playercoords,person[person[i].killtarget].playercoords)&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[l][m])==-1){
-
person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
-
leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-
closesttarget=j;
-
finaltarget=person[i].pathtarget;
-
person[i].whichblockx=l;
-
person[i].whichblocky=m;
-
}
-
}
-
}
-
}
-
}
if(closesttarget!=-1){
-
person[i].pathnum=closesttarget;
-
person[i].pathtarget=finaltarget;
-
}
-
}
-
}
//Assassin
-
if((person[i].killtarget>-1&&person[i].type!=civiliantype)&&!person[i].running){
-
//Dead target?
-
if(person[person[i].killtarget].health<=0&&person[i].type==eviltype){
-
person[i].playerrotation2=0;
-
person[i].whichgun=nogun;
-
person[i].targetanimation=walkanim;
-
person[i].lastdistancevictim=200000;
-
person[i].pathnum=-1;
-
enemystate=1;
-
person[i].killtarget=-1;
-
realcheck=1;
-
}
if(person[i].type==zombietype&&person[person[i].killtarget].health<=0){
-
if(person[person[i].killtarget].eaten!=i){
-
person[i].playerrotation2=0;
-
person[i].targetanimation=zombiewalkanim;
-
person[i].lastdistancevictim=200000;
-
person[i].pathnum=-1;
-
realcheck=1;
-
person[i].killtarget=-1;
-
}
if(person[person[i].killtarget].eaten==i&&person[i].targetanimation!=zombieeatanim){
-
person[i].targetanimation=zombieeatanim;
-
person[i].targetframe=0;
-
person[i].target=0;
-
}
-
enemystate=1;
-
}
if(person[person[i].killtarget].health>0){
-
if(person[person[i].killtarget].skeleton.free){
-
person[person[i].killtarget].playercoords=person[person[i].killtarget].averageloc;
-
}
//If pathfind
-
if(realcheck){
-
leastdistance=2000000;
-
person[i].lastdistancevictim=2000000;
-
closesttarget=-1;
//Check best path
-
for(int j=0;j<path.vertexNum;j++){
-
person[i].pathtarget.x=path.vertex[j].x;
-
person[i].pathtarget.z=path.vertex[j].z;
-
person[i].pathtarget.y=path.vertex[j].y;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
-
person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<person[i].lastdistancevictim&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-
leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-
person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
-
closesttarget=j;
-
finaltarget=person[i].pathtarget;
-
}
-
}
leastdistance=2000000;
-
for(int j=0;j<path.vertexNum;j++){
-
person[i].pathtarget.x=path.vertex[j].x;
-
person[i].pathtarget.z=path.vertex[j].z;
-
person[i].pathtarget.y=path.vertex[j].y;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=person[i].whichblockx*block_spacing;
-
person[i].pathtarget.z+=person[i].whichblocky*block_spacing;
if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<person[i].lastdistancevictim&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-
leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-
person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
-
closesttarget=j;
-
finaltarget=person[i].pathtarget;
-
}
-
}
//Check other blocks?
-
if((closesttarget==person[i].pathnum)||closesttarget==-1){
-
beginx=person[i].whichblockx-2;
-
if(beginx<0)beginx=0;
-
beginz=person[i].whichblocky-2;
-
if(beginz<0)beginz=0;
-
endx=person[i].whichblockx+2;
-
if(endx>num_blocks-1)endx=num_blocks-1;
-
endz=person[i].whichblocky+2;
-
if(endz>num_blocks-1)endz=num_blocks-1;
-
leastdistance=2000000;
for(int l=beginx;l<=endx;l++){
-
for(int m=beginx;m<=endx;m++){
-
if(l!=person[i].whichblockx||m!=person[i].whichblocky){
for(int j=0;j<path.vertexNum;j++){
-
person[i].pathtarget.x=path.vertex[j].x;
-
person[i].pathtarget.y=path.vertex[j].y;
-
person[i].pathtarget.z=path.vertex[j].z;
-
person[i].pathtarget*=person[i].pathsize;
-
person[i].pathtarget.x+=l*block_spacing;
-
person[i].pathtarget.z+=m*block_spacing;
if(findDistancefast(person[i].playercoords,person[i].pathtarget)<leastdistance&&findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords)<findDistancefast(person[i].playercoords,person[person[i].killtarget].playercoords)&&j!=1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[l][m])==-1&&blocksimple.LineCheck2(person[i].playercoords,person[i].pathtarget,&blah,move,cityrotation[person[i].whichblockx][person[i].whichblocky])==-1){
-
leastdistance=findDistancefast(person[i].playercoords,person[i].pathtarget);
-
closesttarget=j;
-
finaltarget=person[i].pathtarget;
-
person[i].whichblockx=l;
-
person[i].whichblocky=m;
-
}
-
}
-
}
-
}
-
}
-
}
if(closesttarget!=-1){
-
person[i].onpath=1;
-
person[i].pathnum=closesttarget;
-
person[i].pathtarget=finaltarget;
-
}
-
}
//Check killtargetvisible
-
person[i].killtargetvisible=1;
if(person[person[i].killtarget].health<=0)person[i].killtargetvisible=0;
@@ -1837,81 +1555,48 @@ void Game::Tick(){
if(person[i].killtarget==0&&visions==1)person[i].killtargetvisible=0;
if(person[i].killtargetvisible){
-
beginx=person[i].whichblockx-2;
-
if(beginx<0)beginx=0;
-
beginz=person[i].whichblocky-2;
-
if(beginz<0)beginz=0;
-
endx=person[i].whichblockx+2;
-
if(endx>num_blocks-1)endx=num_blocks-1;
-
endz=person[i].whichblocky+2;
-
if(endz>num_blocks-1)endz=num_blocks-1;
for(int l=beginx;l<=endx;l++){
-
for(int m=beginx;m<=endx;m++){
-
move.x=l*block_spacing;
-
move.z=m*block_spacing;
-
move.y=-3;
-
if(person[i].killtargetvisible){
-
if(blocksimple.LineCheck2(person[i].playercoords,person[person[i].killtarget].playercoords,&blah,move,cityrotation[l][m])!=-1)
-
{
-
person[i].killtargetvisible=0;
-
}
-
}
-
}
-
}
-
}
if(person[i].type==eviltype){
-
if(!person[i].killtargetvisible&&person[i].targetanimation==idleanim){
-
person[i].targetanimation=joganim;
-
}
if(!person[i].killtargetvisible){
-
person[i].aiming=0;
-
}
if(person[i].killtargetvisible){
-
person[i].onpath=0;
-
person[i].lastdistancevictim=200000;
-
person[i].pathnum=-1;
if(person[i].whichgun==nogun){
-
person[i].whichgun=possiblegun[abs(Random()%numpossibleguns)];
-
person[i].reloads[person[i].whichgun]=1;
-
if(person[i].whichgun==knife)person[i].speedmult=.8+.5*difficulty;
-
}
if(person[i].aiming==0)person[i].shotdelay=shotdelayamount/difficulty;
@@ -1925,395 +1610,235 @@ void Game::Tick(){
if(person[i].whichgun==assaultrifle||person[i].whichgun==sniperrifle||person[i].whichgun==shotgun)person[i].playerrotation2=20;
tooclose=1300;
-
toofar=3000;
if(person[i].whichgun==shotgun){
-
tooclose=1400;
-
toofar=5000;
-
}
if(person[i].whichgun==assaultrifle){
-
tooclose=5000;
-
toofar=9000;
-
}
if(person[i].whichgun==sniperrifle){
-
tooclose=10000;
-
toofar=20000;
-
}
if(person[i].whichgun==knife){
-
tooclose=20;
-
toofar=20000;
-
}
if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)>toofar)
-
person[i].targetanimation=joganim;
if((findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=tooclose&&person[person[i].killtarget].skeleton.free==0)||(tooclose>200&&findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=200)||(tooclose<=200&&findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<tooclose)){
-
if(person[i].targetanimation!=idleanim){
-
person[i].targetanimation=idleanim;
-
person[i].targetframe=0;
-
person[i].target=0;
-
}
if(person[i].whichgun==knife&&person[person[i].killtarget].health==100){
-
murderer=i;
-
person[i].attacktarget=0;
-
person[i].attackframe=0;
float gLoc[3];
-
gLoc[0]=(camera.position.x+((person[i].playercoords.x+flatfacing.x)-camera.position.x)/2)/soundscalefactor;
-
gLoc[1]=(camera.position.y+((person[i].playercoords.y+flatfacing.y)-camera.position.y)/2)/soundscalefactor;
-
gLoc[2]=(camera.position.z+((person[i].playercoords.z+flatfacing.z)-camera.position.z)/2)/soundscalefactor;
if(person[person[i].killtarget].type!=zombietype)
-
{
-
alSourcefv(gSourceID[knifeslashsound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[knifeslashsound]);
-
person[person[i].killtarget].bjoint1=&person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[neck]];
-
person[person[i].killtarget].bjoint2=&person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[neck]];
-
person[person[i].killtarget].bleeding=1;
-
person[person[i].killtarget].bleeddelay=1;
-
person[person[i].killtarget].health-=20;
-
person[person[i].killtarget].targetanimation=chestpainanim;
-
person[person[i].killtarget].targetframe=0;
-
person[person[i].killtarget].target=0;
-
person[person[i].killtarget].longdead=1;
-
}
-
}
-
}
-
finaltarget=person[person[i].killtarget].playercoords;
-
}
-
}
if(person[i].type==zombietype&&person[person[i].killtarget].health>0){
-
if(!person[i].killtargetvisible&&person[i].targetanimation==idleanim){
-
person[i].targetanimation=zombiejoganim;
-
}
if(!person[i].killtargetvisible){
-
person[i].aiming=0;
-
}
if(person[i].killtargetvisible){
-
person[i].onpath=0;
-
person[i].lastdistancevictim=200000;
-
person[i].pathnum=-1;
if(person[i].aiming==0)person[i].shotdelay=shotdelayamount/difficulty;
if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)>20||person[i].targetanimation!=idleanim)
-
person[i].targetanimation=zombiejoganim;
if(findDistancefast(person[i].playercoords, person[person[i].killtarget].playercoords)<=20){
-
murderer=i;
-
person[person[i].killtarget].health=0;
-
person[person[i].killtarget].eaten=i;
-
}
-
finaltarget=person[person[i].killtarget].playercoords;
-
}
-
}
if(person[i].killtargetvisible||realcheck)person[i].pathtarget=finaltarget;
-
if(realcheck)person[i].lastdistancevictim=findDistancefast(person[i].pathtarget,person[person[i].killtarget].playercoords);
-
}
-
}
if(person[i].targetanimation!=zombieeatanim||person[i].type!=zombietype){
-
towards=person[i].playercoords-person[i].pathtarget;
-
Normalise(&towards);
-
person[i].playerrotation=asin(0-towards.x)*360/6.28;
-
if(towards.z>0)person[i].playerrotation=180-person[i].playerrotation;
-
}
-
}
-
}
person[i].whichblockx=((person[i].playercoords.x+block_spacing/2)/block_spacing);
-
person[i].whichblocky=((person[i].playercoords.z+block_spacing/2)/block_spacing);
-
if(!person[i].onground)person[i].velocity.y+=multiplier*gravity;
-
if(!person[i].onground&&(i!=0||visions!=1))person[i].playercoords+=person[i].velocity*multiplier;
//Death by bleeding/shock
-
if(person[i].health<=0){
-
person[i].skeleton.offset=0;
-
person[i].skeleton.free=1;
-
person[i].longdead=1;
for(int j=0;j<person[i].skeleton.num_joints;j++){
-
person[i].skeleton.joints[j].position+=person[i].skeleton.joints[j].offset;
-
person[i].skeleton.joints[j].position=DoRotation(person[i].skeleton.joints[j].position,0,person[i].playerrotation,0);
-
person[i].skeleton.joints[j].position+=person[i].playercoords;
-
person[i].skeleton.joints[j].realoldposition=person[i].skeleton.joints[j].position;
-
person[i].skeleton.joints[j].velocity=DoRotation(person[i].skeleton.joints[j].velocity,0,person[i].playerrotation,0);
-
person[i].skeleton.joints[j].velocity+=person[i].velocity;
-
person[i].skeleton.joints[j].velocity+=person[i].facing*4;
-
}
-
}
-
}
//Rag doll
-
if(person[i].skeleton.free==1&&person[i].longdead>0){
-
person[i].whichblockx=((person[i].skeleton.joints[0].position.x+block_spacing/2)/block_spacing);
-
person[i].whichblocky=((person[i].skeleton.joints[0].position.z+block_spacing/2)/block_spacing);
move=0;
-
move.x=person[i].whichblockx*block_spacing;
-
move.z=person[i].whichblocky*block_spacing;
-
person[i].skeleton.DoGravity();
if(person[i].averageloc.y<=50)person[i].skeleton.DoConstraints(&blocksimplecollide[citytype[person[i].whichblockx][person[i].whichblocky]],&move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
-
if(person[i].averageloc.y>50)person[i].skeleton.DoConstraints(&blockcollide[citytype[person[i].whichblockx][person[i].whichblocky]],&move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
person[i].oldaverageloc=person[i].averageloc;
-
person[i].averageloc=0;
for(int j=0;j<person[i].skeleton.num_joints;j++){
-
person[i].averageloc+=person[i].skeleton.joints[j].position;
-
}
person[i].averageloc/=person[i].skeleton.num_joints;
-
person[i].playercoords=person[i].averageloc;
-
if(person[i].longdead<multiplier/2&&person[i].longdead>0)person[i].DrawSkeleton(i);
-
if(findDistancefast(person[i].averageloc,person[i].oldaverageloc)<.2*multiplier)person[i].longdead-=multiplier/2;
-
}
if(person[i].skeleton.free==1&&person[i].longdead<=0&&person[i].health>0&&person[i].longdead!=-1){
-
person[i].longdead=1;
-
person[i].skeleton.free=0;
-
person[i].currentanimation=lyinganim;
-
person[i].target=0;
-
person[i].targetframe=0;
//Get up from front or back?
-
if(person[i].skeleton.forward.y>0)
-
person[i].targetanimation=getupfrontanim;
-
else
-
person[i].targetanimation=getupbackanim;
//Find playercoords
-
person[i].playercoords=person[i].averageloc;
-
for(int j=0;j<person[i].skeleton.num_joints;j++){
-
if(person[i].skeleton.joints[j].position.y>person[i].playercoords.y)person[i].playercoords.y=person[i].skeleton.joints[j].position.y;
-
}
//Find orientation
-
XYZ firsttop=person[i].skeleton.joints[person[i].skeleton.jointlabels[neck]].position-person[i].skeleton.joints[person[i].skeleton.jointlabels[groin]].position;
-
Normalise(&firsttop);
-
person[i].playerrotation=acos(0-firsttop.z);
-
person[i].playerrotation*=360/6.28;
-
if(0>firsttop.x)person[i].playerrotation=360-person[i].playerrotation;
-
person[i].playerrotation*=-1;
-
person[i].playervelocity=0;
-
if(person[i].targetanimation==getupfrontanim)person[i].playerrotation+=180;
for(int j=0;j<person[i].skeleton.num_joints;j++){
-
person[i].tempanimation.position[j][0]=person[i].skeleton.joints[j].position-person[i].playercoords;
-
person[i].tempanimation.position[j][0]=DoRotation(person[i].tempanimation.position[j][0],0,-person[i].playerrotation,0);
-
}
-
}
-
}
//Grenade
-
if(Button()&&person[0].whichgun==grenade&&person[0].ammo>0&&person[0].reloading<=0&&person[0].attackframe<0&&person[0].targetanimation!=crouchanim){
-
if(person[0].grenphase==0){
-
XYZ soundsource=DoRotation(person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]].position,0,person[0].playerrotation,0)+person[0].playercoords;
-
float gLoc[3];
-
gLoc[0]=soundsource.x/soundscalefactor;
-
gLoc[1]=soundsource.y/soundscalefactor;
-
gLoc[2]=soundsource.z/soundscalefactor;
-
alSourcefv(gSourceID[pinpullsound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[pinpullsound]);
-
person[0].grenphase=1;
-
}
-
}
if((!Button())&&person[0].whichgun==grenade){
-
if(person[0].grenphase==1){
-
person[0].grenphase=0;
-
person[0].attackframe=0;
-
person[0].attacktarget=0;
-
person[0].killtarget=0;
-
}
-
}
if(person[0].targetanimation==crouchanim){
-
if(person[0].grenphase==1){
-
person[0].grenphase=0;
-
XYZ soundsource=DoRotation(person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]].position,0,person[0].playerrotation,0)+person[0].playercoords;
-
float gLoc[3];
-
gLoc[0]=soundsource.x/soundscalefactor;
-
gLoc[1]=soundsource.y/soundscalefactor;
-
gLoc[2]=soundsource.z/soundscalefactor;
-
alSourcefv(gSourceID[pinreplacesound], AL_POSITION, gLoc);
-
alSourcePlay(gSourceID[pinreplacesound]);
-
}
-
}
//Get gun
-
int temp;
-
int temp2;
-
bool switched=0;
-
if(Button()&&!oldbutton&&(person[0].aiming==0||person[0].whichgun==grenade||person[0].whichgun==nogun||person[0].whichgun==knife)&&person[0].currentanimation==crouchanim){
for(int i=0;i<max_people;i++){