Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
293 changes: 293 additions & 0 deletions 2001/ze_resident_evil_3/boss_move_tar_akuma.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@

import { Instance } from "cs_script/point_script";


const TICKRATE = 0.1;
const TARGET_DISTANCE = 3000;
let SPEED_FORWARD = 220;
const RETARGET_TIME = 8.00;

const boss_model = "Nemesis_Model";
const boss_move_physbox = "Nemesis_Phys";
const boss_script_ent = "nemesis_akuma_script";

let p = null;
// let boss_id = "";
// let boss_script_ent = null;
let bmphy = null;
let bmdl = null;
let ttime = 0.00;
let ticking = false;

let speed_turning = 350;
let ang_rot_limit = 10;
let b_MaxDistToPl = 32;

let lastTime = null;

Instance.OnRoundStart(() => {
p = null;
ttime = 0.00;
bmdl = null;
bmphy = null;
ticking = false;
lastTime = null;
SPEED_FORWARD = 220;
});

Instance.OnScriptInput("SetSpeedX2", ({ caller, activator }) => {
SPEED_FORWARD *= 2;
});

Instance.OnScriptInput("SetSpeedX1.5", ({ caller, activator }) => {
SPEED_FORWARD *= 1.5;
});

Instance.OnScriptInput("AttackSpeed", ({ caller, activator }) => {
SPEED_FORWARD -= 100;

});

Instance.OnScriptInput("SetSpeedX1.7", ({ caller, activator }) => {
SPEED_FORWARD *= 1.7;
});

Instance.OnScriptInput("ResetSpeed", ({ caller, activator }) => {
SPEED_FORWARD = 220;
});

Instance.OnScriptInput("SetSpeedX240", ({ caller, activator }) => {
SPEED_FORWARD += 20;
});

function SetEntities()
{
if(ticking)
{
return;
}
if(!bmdl?.IsValid() )
{
let boss_phys = Instance.FindEntityByName(boss_model);
if(boss_phys?.IsValid())
{
bmdl = boss_phys;
}
else
{
//Instance.Msg("Can't Find: "+boss_model);
}
}
if(!bmphy?.IsValid() )
{
let boss_phys = Instance.FindEntityByName(boss_move_physbox);
if(boss_phys?.IsValid())
{
bmphy = boss_phys;
}
else
{
//Instance.Msg("Can't Find: "+boss_move_physbox);
}
}
}

Instance.OnScriptInput("Start", () => {
if(!ticking)
{
// AutoDetectEntities();
SetEntities();
ticking = true;
Instance.EntFireAtName({ name: boss_script_ent, input: "runscriptinput", value: "Tick", delay: TICKRATE });
}
});

Instance.OnScriptInput("Stop", () => {
if(ticking)
{
ticking = false;
bmphy.Teleport({velocity: {x: 0, y: 0, z: 0}});
}
});

Instance.OnScriptInput("Tick", () => {
if (!bmdl?.IsValid() || !bmphy?.IsValid())
{
return;
}
let currentTime = Instance.GetGameTime();
if(lastTime === null)
{
lastTime = currentTime;
}

let deltaTime = currentTime - lastTime;
lastTime = currentTime;

if(ticking)
{
Instance.EntFireAtName({ name: boss_script_ent, input: "runscriptinput", value: "Tick", delay: TICKRATE });
}
else
{
bmphy.Teleport({velocity: {x: 0, y: 0, z: 0}});
return;
}

if(p == null || !p?.IsValid() || p?.GetHealth() <= 0.00 || p?.GetTeamNumber() != 3 || ttime >= RETARGET_TIME)
{
p = null;
return SearchTarget();
}
ttime += deltaTime;
let gto = p.GetAbsOrigin();
let npc_m_gto = bmdl.GetAbsOrigin();
let tm_ang = GetYawFVect2D(gto, npc_m_gto);
let setg_rangd = SetGraduallyAng(tm_ang, bmdl);
if(setg_rangd > 0 && setg_rangd <= ang_rot_limit || setg_rangd < 0 && setg_rangd >= -ang_rot_limit)
{
let dist_pb = GetDistance(npc_m_gto, gto);
if(dist_pb > b_MaxDistToPl)
{
let direction = VectorSubtract(gto, npc_m_gto);
let normalizedDirection = NormalizeVector(direction);
let pushVelocity = MultiplyVectorByScalar(normalizedDirection, SPEED_FORWARD);
bmphy.Teleport({velocity: {x: pushVelocity.x, y: pushVelocity.y, z: bmphy.GetAbsVelocity().z}});
}
else
{
bmphy.Teleport({velocity: {x: 0, y: 0, z: 0}});
}
}
else
{
bmphy.Teleport({velocity: {x: 0, y: 0, z: 0}});
}

});

function SearchTarget()
{
ttime = 0.00;
if(bmdl?.IsValid())
{
let candidates = [];
let players = Instance.FindEntitiesByClass("player");
for(let i = 0; i < players.length; i++)
{
if(players[i]?.IsValid() && players[i].GetTeamNumber() == 3 && players[i].GetHealth() > 0 && GetDistance(players[i].GetAbsOrigin(), bmdl.GetAbsOrigin()) <= TARGET_DISTANCE)
{
candidates.push(players[i]);
}
}
if(candidates.length > 0)
{
let rnd_player = candidates[GetRandomInt(0, candidates.length - 1)]
p = rnd_player;
//Instance.Msg(`TARGET: ${p?.GetPlayerController()?.GetPlayerName()}`);
return;
}
else
{
//Instance.Msg("No alive players found");
return null;
}
}
//Instance.Msg("Physbox not valid");
return null;
}

function SetGraduallyAng(ang_t, ent)
{
let ang_y = ent.GetAbsAngles().yaw
let ang_dif = AngleDiff( ang_t, ang_y );
if(speed_turning > 1000)
{
speed_turning = 1000;
}
else if(speed_turning < 100)
{
speed_turning = 100;
}
let add_gs = speed_turning * TICKRATE;
while (ang_y < -180)
{
ang_y = ang_y + 360;
}
while (ang_y > 180)
{
ang_y = ang_y - 360;
}
if(ang_dif > add_gs)
{
ent.Teleport({ angles: {pitch: ent.GetAbsAngles().pitch, yaw: Math.round(ang_y + add_gs), roll: ent.GetAbsAngles().roll} });
}
else if(ang_dif < -add_gs)
{
ent.Teleport({ angles: {pitch: ent.GetAbsAngles().pitch, yaw: Math.round(ang_y - add_gs), roll: ent.GetAbsAngles().roll} });
}
return ang_dif
}

function GetYawFVect2D(a, b) {
const deltaX = a.x - b.x;
const deltaY = a.y - b.y;
const yaw = (Math.atan2(deltaY, deltaX) * 180) / Math.PI;
return yaw;
}

function AngleDiff(angle1, angle2)
{
let diff = angle1 - angle2;

while (diff > 180) diff -= 360;
while (diff < -180) diff += 360;

return diff;
}
function GetDistance(v1, v2) {
return Math.sqrt(
(v1.x - v2.x) * (v1.x - v2.x) +
(v1.y - v2.y) * (v1.y - v2.y) +
(v1.z - v2.z) * (v1.z - v2.z)
);
}

function VectorSubtract(v1, v2)
{
return {
x: v1.x - v2.x,
y: v1.y - v2.y,
z: v1.z - v2.z
};
}

function VectorLength(v)
{
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
}


function NormalizeVector(v)
{
let length = VectorLength(v);
if (length === 0) return { x: 0, y: 0, z: 0 };
return {
x: v.x / length,
y: v.y / length,
z: v.z / length
};
}

function MultiplyVectorByScalar(v, scalar)
{
return {
x: v.x * scalar,
y: v.y * scalar,
z: v.z * scalar
};
}

function GetRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Loading