Files
wnsrc/lua/entities/dodgefunc.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

99 lines
5.0 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ENT.IsDodging = false
ENT.NextDodgeTime = 0
function ENT:DoDodge(dist, chance, dodgeleft, dodgeright, dodgeback, dodgeforward)
if !self.Dead && !self.MeleeAttacking && !self.ComboAttacking then
if self.VJ_IsBeingControlled then
self:StopAttacks(true)
if self.VJ_TheController:KeyDown(IN_MOVELEFT) && self.VJ_TheController:KeyDown(IN_JUMP) && CurTime() > self.NextDodgeTime then
self.IsDodging = true
self:VJ_ACT_PLAYACTIVITY(dodgeleft,true,false,true) -- Left dodge anim
self.NextDodgeTime = CurTime() + VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence()))+0.2
timer.Simple(VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence())), function() self.IsDodging = false end)
elseif self.VJ_TheController:KeyDown(IN_MOVERIGHT) && self.VJ_TheController:KeyDown(IN_JUMP) && CurTime() > self.NextDodgeTime then
self.IsDodging = true
self:VJ_ACT_PLAYACTIVITY(dodgeright,true,false,true) -- Left dodge anim
self.NextDodgeTime = CurTime() + VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence()))+0.2
timer.Simple(VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence())), function() self.IsDodging = false end)
elseif self.VJ_TheController:KeyDown(IN_BACK) && self.VJ_TheController:KeyDown(IN_JUMP) && CurTime() > self.NextDodgeTime then
self.IsDodging = true
self:VJ_ACT_PLAYACTIVITY(dodgeback,true,false,true) -- Left dodge anim
self.NextDodgeTime = CurTime() + VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence()))+0.2
timer.Simple(VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence())), function() self.IsDodging = false end)
elseif self.VJ_TheController:KeyDown(IN_FORWARD) && self.VJ_TheController:KeyDown(IN_JUMP) && CurTime() > self.NextDodgeTime then
self.IsDodging = true
self:VJ_ACT_PLAYACTIVITY(dodgeforward,true,false,true) -- Left dodge anim
self.NextDodgeTime = CurTime() + VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence()))+0.2
timer.Simple(VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence())), function() self.IsDodging = false end)
end
end
if self:GetEnemy() != nil && !self.VJ_IsBeingControlled && CurTime() > self.NextDodgeTime then
local EnemyDistance = self:VJ_GetNearestPointToEntityDistance(self:GetEnemy(),self:GetPos():Distance(self:GetEnemy():GetPos()))
if EnemyDistance <= dist && math.random(1,chance) == 1 && (self:CanDodge("normal") or self:CanDodge("player")) then -- Random movement
self:StopAttacks(true)
self.IsDodging = true
local dodge_close = math.random(1, 3)
if dodge_close == 1 then
self:VJ_ACT_PLAYACTIVITY(dodgeleft,true,false,true) -- Left dodge anim
elseif dodge_close == 2 then
self:VJ_ACT_PLAYACTIVITY(dodgeright,true,false,true) -- Right dodge anim
elseif dodge_close == 3 then
self:VJ_ACT_PLAYACTIVITY(dodgeback,true,false,true) -- Right dodge anim
end
self.NextDodgeTime = CurTime() + VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence()))+0.2
timer.Simple(VJ_GetSequenceDuration(self,self:GetSequenceName(self:GetSequence())), function() self.IsDodging = false end)
end
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:CanDodge(dodgetype)
if dodgetype == "normal" then
if !self.RangeAttacking && !self.MeleeAttacking && self:GetEnemy():IsNPC()
&& ((self:GetEnemy().MeleeAttacking && self:GetEnemy().MeleeAttacking)
or (self:GetEnemy().IsAttacking && self:GetEnemy().IsAttacking)) then
return true
else
return false
end
elseif dodgetype == "player" then
if !self.RangeAttacking && !self.MeleeAttacking && self:GetEnemy():IsPlayer()
&& self:GetEnemy():GetEyeTrace().Entity == self && self:GetEnemy():IsPlayer() && self:GetEnemy():GetActiveWeapon() != nil
&& self.AcceptableWeaponsTbl[self:GetEnemy():GetActiveWeapon():GetClass()]
&& (self:GetEnemy():KeyPressed(IN_ATTACK) or self:GetEnemy():KeyPressed(IN_ATTACK2)
or self:GetEnemy():KeyReleased(IN_ATTACK) or self:GetEnemy():KeyReleased(IN_ATTACK2)
or self:GetEnemy():KeyDown(IN_ATTACK) or self:GetEnemy():KeyDown(IN_ATTACK2)) then
return true
else
return false
end
end
end
---------------------------------------------------------------------------------------------------------------------------------------------
function ENT:FindSeq(seq)
return self:GetSequenceActivity(self:LookupSequence(seq))
end
---------------------------------------------------------------------------------------------------------------------------------------------
ENT.AcceptableWeaponsTbl = {
["gmod_camera"]=true,
["gmod_tool"]=true,
["weapon_physgun"]=true,
["weapon_physcannon"]=true
}