aboutsummaryrefslogtreecommitdiff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2022-02-06 17:32:04 +0700
committerNguyễn Gia Phong <mcsinyx@disroot.org>2022-02-06 17:32:04 +0700
commitc1fd45b68a0c294129f724d10a718bb0589e3167 (patch)
tree9421ac3a3673b61439c749d83dc922e15a14f911 /src/GameTick.cpp
parent43c7739c47cee57e2bab1f431cf77e11ac728354 (diff)
downloadblackshades-c1fd45b68a0c294129f724d10a718bb0589e3167.tar.gz
Only draw laser when it is possible to shoot
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r--src/GameTick.cpp277
1 files changed, 97 insertions, 180 deletions
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index b380202..f5ec2f4 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -736,6 +736,101 @@ void tackle(Game* game, XYZ flatfacing)
}
}
+void renderLaser(Game* game)
+{
+ auto& player = game->person[0];
+ if (!player.aiming)
+ return;
+ switch (player.currentanimation) {
+ case walkanim:
+ case idleanim:
+ break;
+ default:
+ return;
+ }
+
+ XYZ aim;
+ float coeff;
+ auto& joints = player.skeleton.joints;
+ auto& rotation = player.playerrotation;
+ switch (player.whichgun) {
+ case assaultrifle:
+ aim = DoRotation(joints[lefthand].position
+ - joints[righthand].position,
+ 0.0f, rotation - 2.5f, 0.0f);
+ coeff = 0.15f;
+ break;
+ case sniperrifle:
+ case shotgun:
+ aim = DoRotation(joints[lefthand].position
+ - joints[righthand].position,
+ 0.0f, rotation + 4.0f, 0.0f);
+ coeff = 0.4f;
+ break;
+ case handgun1:
+ case handgun2:
+ coeff = thirdperson ? 0.35f : 0.65f;
+ aim = DoRotation(joints[righthand].position
+ - joints[head].position * coeff
+ - joints[neck].position * (1.0 - coeff),
+ 0.0f, player.playerrotation - 0.9f, 0.0f);
+ coeff = -0.15f;
+ break;
+ default:
+ return;
+ }
+
+ Normalise(&aim);
+ auto& coords = player.playercoords;
+ auto start = coords
+ + DoRotation(joints[lefthand].position, 0.0f, rotation, 0.0f)
+ + DoRotation(DoRotation(DoRotation(aim, 0.0f, -rotation, 0.0f),
+ 90.0f, 0.0f, 0.0f),
+ 0.0f, rotation, 0) * coeff;
+ auto end = start + aim * 1000.0f;
+
+ // Blocks
+ int x = coords.x / block_spacing + 0.5f;
+ int z = coords.z / block_spacing + 0.5f;
+ for (int i = std::max(0, x - 2); i < std::min(num_blocks, x + 3); ++i)
+ for (int j = std::max(0, z - 2); j < std::min(num_blocks, z + 3); ++j) {
+ XYZ move = {
+ (float) i * block_spacing,
+ 0.0f,
+ (float) j * block_spacing,
+ };
+ XYZ tmp {};
+ auto& block = game->blocks[game->citytype[i][j]];
+ auto whichtri = block.LineCheck2(start, end,
+ &tmp, move, game->cityrotation[i][j]*90);
+ if (whichtri != -1)
+ end = tmp;
+ }
+ XYZ tmp {camera.position.x, 0.0f, camera.position.z};
+ auto whichtri = game->Bigstreet.LineCheck2(start, end, &tmp, tmp, 0);
+ if (whichtri != -1)
+ end = tmp;
+
+ // People
+ float olddistance = 0.0f;
+ int whichhit = -1;
+ for (auto i = 1; i < game->numpeople; ++i) {
+ auto& person = game->person[i];
+ if (findDistancefast(coords, person.playercoords) > 20000)
+ continue;
+ auto hit = person.BulletCollideWithPlayer(i, start, end);
+ if (!hit.collision)
+ continue;
+ auto distance = findDistancefast(start, hit.hitlocation);
+ if (distance < olddistance || whichhit == -1) {
+ olddistance = distance;
+ whichhit = i;
+ end = hit.hitlocation;
+ }
+ }
+ sprites.MakeSprite(bulletinstant, 0.4f, 1, 0, 0, start, end, 0.2f);
+}
+
void Game::Tick()
{
if (person[1].health <= 0 || person[0].health <= 0 || killedinnocent)
@@ -2085,186 +2180,8 @@ void Game::Tick()
}
}
- if(lasersight&&person[0].whichgun!=grenade){
-
- for(int j=0;j<numpeople;j++){
-
- if(person[j].type==playertype){
-
- if(person[j].aiming>=1){
-
- //Firing
- XYZ end, aim;
-
- HitStruct hitstruct,temphitstruct;
-
- float olddistance = 0.0f;
-
- float distance;
-
- int whichhit=-1;
-
- if(!zoom||j!=0){
-
- if(person[j].whichgun==assaultrifle)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation-2.5,0);
-
- if(person[j].whichgun==sniperrifle)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation+4,0);
-
- if(person[j].whichgun==shotgun)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation+4,0);
-
- if(person[j].whichgun==handgun1&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.65+person[j].skeleton.joints[neck].position*.35),0,person[j].playerrotation-.9,0);
-
- if(person[j].whichgun==handgun1&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.35+person[j].skeleton.joints[neck].position*.65),0,person[j].playerrotation-.9,0);
-
- if(person[j].whichgun==handgun2&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.65+person[j].skeleton.joints[neck].position*.35),0,person[j].playerrotation-.9,0);
-
- if(person[j].whichgun==handgun2&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.35+person[j].skeleton.joints[neck].position*.65),0,person[j].playerrotation-.9,0);
-
- }
-
- if(zoom&&j==0){
-
- start=camera.position;
-
- aim=facing;
-
- }
-
- Normalise(&aim);
-
- if(person[j].whichgun==sniperrifle){
-
- start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
-
- start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(0-.4);
-
- }
-
- if(person[j].whichgun==shotgun){
-
- start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
-
- start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(0-.4);
-
- }
-
- if(person[j].whichgun==handgun1){
-
- start=person[j].playercoords+DoRotation(person[j].skeleton.joints[rightwrist].position,0,person[j].playerrotation,0);
-
- start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.55-.4);
-
- }
-
- if(person[j].whichgun==handgun2){
-
- start=person[j].playercoords+DoRotation(person[j].skeleton.joints[rightwrist].position,0,person[j].playerrotation,0);
-
- start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.55-.4);
-
- }
-
- if(person[j].whichgun==assaultrifle){
-
- start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
-
- start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.25-.4);
-
- }
-
- end=start+aim*1000;
-
- // Blocks
- wallhit = {};
- beginx=(person[j].playercoords.x+block_spacing/2)/block_spacing-2;
-
- if(beginx<0)beginx=0;
-
- beginz=(person[j].playercoords.z+block_spacing/2)/block_spacing-2;
-
- if(beginz<0)beginz=0;
-
- endx=(person[j].playercoords.x+block_spacing/2)/block_spacing+2;
-
- if(endx>num_blocks-1)endx=num_blocks-1;
-
- endz=(person[j].playercoords.z+block_spacing/2)/block_spacing+2;
-
- if(endz>num_blocks-1)endz=num_blocks-1;
-
- if(beginx<endx&&beginz<endz)
-
- finalwallhit = {};
- for(int i=beginx;i<=endx;i++)
- for(int j=beginz;j<=endz;j++){
- move = {(float) i * block_spacing, 0.0f, (float) j * block_spacing};
- whichtri=blocks[citytype[i][j]].LineCheck2(start,end,&wallhit,move,cityrotation[i][j]*90);
-
- if(whichtri!=-1){
-
- end=wallhit;
-
- finalwallhit=wallhit;
-
- }
-
- }
- wallhit = {camera.position.x, 0.0f, camera.position.z};
- whichtri=Bigstreet.LineCheck2(start,end,&wallhit,wallhit,0);
-
- if(whichtri!=-1){
-
- end=wallhit;
-
- finalwallhit=wallhit;
-
- }
-
- //People
-
- whichhit=-1;
-
- for(int i=0;i<numpeople;i++){
-
- if(i!=j&&findDistancefast(person[j].playercoords,person[i].playercoords)<20000){
-
- temphitstruct=person[i].BulletCollideWithPlayer(i, start, end);
-
- if(temphitstruct.collision){
-
- distance=findDistancefast(start,temphitstruct.hitlocation);
-
- if(distance<olddistance||whichhit==-1){
-
- end=temphitstruct.hitlocation;
-
- olddistance=distance;
-
- hitstruct=temphitstruct;
-
- whichhit=i;
-
- }
-
- }
-
- }
-
- }
-
- aimer[0]=start;
-
- aimer[1]=end;
-
- sprites.MakeSprite(bulletinstant, .4, 1, 0, 0, aimer[0], aimer[1], .2);
-
- }
-
- }
-
- }
-
- }
+ if (lasersight && !zoom)
+ renderLaser(this);
//Snow
snowdelay-=multiplier;