mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-26 17:37:53 -05:00
352 lines
6.4 KiB
Plaintext
352 lines
6.4 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: maps\mp\animscripts\zm_melee.gsc
|
|
* Game: Call of Duty: Black Ops 2
|
|
* Platform: PC
|
|
* Function Count: 8
|
|
* Decompile Time: 6 ms
|
|
* Timestamp: 10/28/2023 12:11:31 AM
|
|
*******************************************************************/
|
|
|
|
#include common_scripts/utility;
|
|
#include maps/mp/animscripts/shared;
|
|
#include maps/mp/animscripts/utility;
|
|
#include maps/mp/animscripts/zm_combat;
|
|
#include maps/mp/animscripts/zm_utility;
|
|
|
|
//Function Number: 1
|
|
meleecombat()
|
|
{
|
|
self endon("end_melee");
|
|
self endon("killanimscript");
|
|
/#
|
|
assert(canmeleeanyrange());
|
|
#/
|
|
self orientmode("face enemy");
|
|
if(is_true(self.sliding_on_goo))
|
|
{
|
|
self animmode("slide");
|
|
}
|
|
else
|
|
{
|
|
self animmode("zonly_physics");
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
if(IsDefined(self.marked_for_death))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(IsDefined(self.enemy))
|
|
{
|
|
angles = VectorToAngles(self.enemy.origin - self.origin);
|
|
self orientmode("face angle",angles[1]);
|
|
}
|
|
|
|
if(IsDefined(self.zmb_vocals_attack))
|
|
{
|
|
self playsound(self.zmb_vocals_attack);
|
|
}
|
|
|
|
if(IsDefined(self.nochangeduringmelee) && self.nochangeduringmelee)
|
|
{
|
|
self.safetochangescript = 0;
|
|
}
|
|
|
|
if(IsDefined(self.is_inert) && self.is_inert)
|
|
{
|
|
return;
|
|
}
|
|
|
|
set_zombie_melee_anim_state(self);
|
|
if(IsDefined(self.melee_anim_func))
|
|
{
|
|
self thread [[ self.melee_anim_func ]]();
|
|
}
|
|
|
|
while(1)
|
|
{
|
|
self waittill("melee_anim",note);
|
|
if(note == "end")
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if(note == "fire")
|
|
{
|
|
if(!(IsDefined(self.enemy)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(IsDefined(self.dont_die_on_me) && self.dont_die_on_me)
|
|
{
|
|
break;
|
|
}
|
|
|
|
self.enemy notify("melee_swipe",self);
|
|
oldhealth = self.enemy.health;
|
|
self melee();
|
|
if(!(IsDefined(self.enemy)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(self.enemy.health >= oldhealth)
|
|
{
|
|
if(IsDefined(self.melee_miss_func))
|
|
{
|
|
self [[ self.melee_miss_func ]]();
|
|
}
|
|
else if(IsDefined(level.melee_miss_func))
|
|
{
|
|
self [[ level.melee_miss_func ]]();
|
|
}
|
|
}
|
|
|
|
/#
|
|
if(GetDvarInt(#"7F11F572"))
|
|
{
|
|
if(self.enemy.health < oldhealth)
|
|
{
|
|
zombie_eye = self geteye();
|
|
player_eye = self.enemy geteye();
|
|
trace = bullettrace(zombie_eye,player_eye,1,self);
|
|
hitpos = trace["position"];
|
|
dist = distance(zombie_eye,hitpos);
|
|
iprintln("melee HIT " + dist);
|
|
}
|
|
}
|
|
#/
|
|
continue;
|
|
}
|
|
|
|
if(note == "stop")
|
|
{
|
|
if(!(cancontinuetomelee()))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(is_true(self.sliding_on_goo))
|
|
{
|
|
self orientmode("face enemy");
|
|
}
|
|
else
|
|
{
|
|
self orientmode("face default");
|
|
}
|
|
|
|
if((IsDefined(self.nochangeduringmelee) && self.nochangeduringmelee) || is_true(self.sliding_on_goo))
|
|
{
|
|
if(IsDefined(self.enemy))
|
|
{
|
|
dist_sq = distancesquared(self.origin,self.enemy.origin);
|
|
if(dist_sq > self.meleeattackdist * self.meleeattackdist)
|
|
{
|
|
self.safetochangescript = 1;
|
|
wait(0.1);
|
|
break;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
self.safetochangescript = 1;
|
|
wait(0.1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(is_true(self.sliding_on_goo))
|
|
{
|
|
self animmode("slide");
|
|
}
|
|
else
|
|
{
|
|
self animmode("none");
|
|
}
|
|
|
|
self thread maps/mp/animscripts/zm_combat::main();
|
|
}
|
|
|
|
//Function Number: 2
|
|
cancontinuetomelee()
|
|
{
|
|
return canmeleeinternal("already started");
|
|
}
|
|
|
|
//Function Number: 3
|
|
canmeleeanyrange()
|
|
{
|
|
return canmeleeinternal("any range");
|
|
}
|
|
|
|
//Function Number: 4
|
|
canmeleedesperate()
|
|
{
|
|
return canmeleeinternal("long range");
|
|
}
|
|
|
|
//Function Number: 5
|
|
canmelee()
|
|
{
|
|
return canmeleeinternal("normal");
|
|
}
|
|
|
|
//Function Number: 6
|
|
canmeleeinternal(state)
|
|
{
|
|
if(!(issentient(self.enemy)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(!(isalive(self.enemy)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(IsDefined(self.disablemelee))
|
|
{
|
|
/#
|
|
assert(self.disablemelee);
|
|
#/
|
|
return 0;
|
|
}
|
|
|
|
yaw = Abs(getyawtoenemy());
|
|
if((yaw > 60 && state != "already started") || yaw > 110)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
enemypoint = self.enemy getorigin();
|
|
vectoenemy = enemypoint - self.origin;
|
|
self.enemydistancesq = lengthsquared(vectoenemy);
|
|
if(self.enemydistancesq <= anim.meleerangesq)
|
|
{
|
|
if(!(ismeleepathclear(vectoenemy,enemypoint)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
if(state != "any range")
|
|
{
|
|
chargerangesq = anim.chargerangesq;
|
|
if(state == "long range")
|
|
{
|
|
chargerangesq = anim.chargelongrangesq;
|
|
}
|
|
|
|
if(self.enemydistancesq > chargerangesq)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if(state == "already started")
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(IsDefined(self.check_melee_path) && self.check_melee_path)
|
|
{
|
|
if(!(ismeleepathclear(vectoenemy,enemypoint)))
|
|
{
|
|
self notify("melee_path_blocked");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if(IsDefined(level.can_melee))
|
|
{
|
|
if(!(self [[ level.can_melee ]]()))
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//Function Number: 7
|
|
ismeleepathclear(vectoenemy,enemypoint)
|
|
{
|
|
dirtoenemy = vectornormalize((vectoenemy[0],vectoenemy[1],0));
|
|
meleepoint = enemypoint - (dirtoenemy[0] * 28,dirtoenemy[1] * 28,0);
|
|
if(!(self isingoal(meleepoint)))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if(self maymovetopoint(meleepoint))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
trace1 = bullettrace(20 + VectorScale((0,0,1)),self.origin,20 + VectorScale((0,0,1)),meleepoint);
|
|
trace2 = bullettrace(72 + VectorScale((0,0,1)),self.origin,72 + VectorScale((0,0,1)),meleepoint);
|
|
if(IsDefined(trace1["fraction"]) && trace1["fraction"] == 1 && IsDefined(trace2["fraction"]) && trace2["fraction"] == 1)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(IsDefined(trace1["entity"]) && trace1["entity"] == self.enemy && IsDefined(trace2["entity"]) && trace2["entity"] == self.enemy)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if(IsDefined(level.zombie_melee_in_water) && level.zombie_melee_in_water)
|
|
{
|
|
if(IsDefined(trace1["surfacetype"]) && trace1["surfacetype"] == "water" && IsDefined(trace2["fraction"]) && trace2["fraction"] == 1)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Function Number: 8
|
|
set_zombie_melee_anim_state(zombie)
|
|
{
|
|
if(IsDefined(level.melee_anim_state))
|
|
{
|
|
melee_anim_state = self [[ level.melee_anim_state ]]();
|
|
}
|
|
|
|
if(!(IsDefined(melee_anim_state)))
|
|
{
|
|
if(!zombie.has_legs && zombie.a.gib_ref == "no_legs")
|
|
{
|
|
melee_anim_state = "zm_stumpy_melee";
|
|
}
|
|
else
|
|
{
|
|
switch(zombie.zombie_move_speed)
|
|
{
|
|
case "walk":
|
|
melee_anim_state = append_missing_legs_suffix("zm_walk_melee");
|
|
break;
|
|
|
|
case "run":
|
|
case "sprint":
|
|
default:
|
|
melee_anim_state = append_missing_legs_suffix("zm_run_melee");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
zombie setanimstatefromasd(melee_anim_state);
|
|
} |