From 9fc33c1a38799d396b602c84ef6fadbe8d503ac4 Mon Sep 17 00:00:00 2001 From: Jakob MG Date: Tue, 14 Jun 2011 20:18:33 +0200 Subject: [PATCH] Testcase for netlinked bug --- qcsrc/client/progs.src | 1 + qcsrc/client/tturrets.qc | 4 + qcsrc/server/movelib.qc | 3 + qcsrc/server/tturrets/system/system_damage.qc | 34 +--- qcsrc/server/tturrets/system/system_main.qc | 20 +- qcsrc/server/tturrets/units/unit_walker.qc | 191 +++++------------- unit_walker.cfg | 6 +- 7 files changed, 81 insertions(+), 178 deletions(-) diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 50b8800a5..09c3bd1af 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -32,6 +32,7 @@ noise.qh teamplay.qh tturrets.qh ../server/tturrets/include/turrets_early.qh +../server/movelib.qc main.qh sortlist.qc diff --git a/qcsrc/client/tturrets.qc b/qcsrc/client/tturrets.qc index 88d5c13d0..7dc0a214d 100644 --- a/qcsrc/client/tturrets.qc +++ b/qcsrc/client/tturrets.qc @@ -1,3 +1,4 @@ + void turrets_precache() { precache_model ("models/turrets/ewheel-base2.md3"); @@ -94,6 +95,9 @@ void turret_moving_draw() if(dt <= 0) return; + fixedmakevectors(self.angles); + movelib_groundalign4point(300, 100, 0.25); + setorigin(self, self.origin + self.velocity * dt); if(self.turret_type == TID_WALKER) setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head"))); diff --git a/qcsrc/server/movelib.qc b/qcsrc/server/movelib.qc index 89feff9a4..7c5d0eb76 100644 --- a/qcsrc/server/movelib.qc +++ b/qcsrc/server/movelib.qc @@ -1,3 +1,4 @@ +#ifdef SVQC .vector moveto; /** @@ -183,6 +184,8 @@ void movelib_beak_simple(float force) Pitches and rolls the entity to match the gound. Yed need to set v_up and v_forward (generally by calling makevectors) before calling this. **/ +#endif + void movelib_groundalign4point(float spring_length, float spring_up, float blendrate) { vector a, b, c, d, e, r, push_angle, ahead, side; diff --git a/qcsrc/server/tturrets/system/system_damage.qc b/qcsrc/server/tturrets/system/system_damage.qc index 7459db357..3e99076b6 100644 --- a/qcsrc/server/tturrets/system/system_damage.qc +++ b/qcsrc/server/tturrets/system/system_damage.qc @@ -11,9 +11,6 @@ void turret_hide() void turret_stdproc_die() { - vector org2; - vector t_dir; - self.deadflag = DEAD_DEAD; self.tur_head.deadflag = self.deadflag; @@ -25,34 +22,10 @@ void turret_stdproc_die() self.takedamage = DAMAGE_NO; self.health = 0; -/* -// Trow fake parts arround - // base - if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS) - { - makevectors(self.angles); - if (random() > 0.5) - { - turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1); - - t_dir = (v_up * 700) + (randomvec() * 300); - turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1); - - t_dir = (v_up * 700) + (randomvec() * 300); - turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1); - } - else - { - turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1); - } - - // Blow the top part up into the air - turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5)); - } // Go boom //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world); -*/ + if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN) { if (self.turret_diehook) @@ -77,7 +50,6 @@ void turret_stdproc_respawn() { // Make sure all parts belong to the same team since // this function doubles as "teamchange" function. - self.tur_head.team = self.team; self.effects &~= EF_NODRAW; @@ -98,9 +70,10 @@ void turret_stdproc_respawn() self.ammo = self.ammo_max; self.nextthink = time + self.ticrate; + //self.think = turret_think; + self.think = turret_link; self.SendFlags = TNSF_FULL_UPDATE; - self.think = turret_link; if (self.turret_respawnhook) self.turret_respawnhook(); @@ -111,7 +84,6 @@ void turret_stdproc_respawn() */ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce) { - // Enougth allready! if (self.health <= 0) return; diff --git a/qcsrc/server/tturrets/system/system_main.qc b/qcsrc/server/tturrets/system/system_main.qc index 12bb12f38..808876542 100644 --- a/qcsrc/server/tturrets/system/system_main.qc +++ b/qcsrc/server/tturrets/system/system_main.qc @@ -1,8 +1,23 @@ #define cvar_base "g_turrets_unit_" +.float clientframe; +void turrets_setframe(float _frame, float client_only) +{ + if((client_only ? self.clientframe : self.frame ) != _frame) + { + self.SendFlags |= TNSF_ANIM; + self.anim_start_time = time; + } + + if(client_only) + self.clientframe = _frame; + else + self.frame = _frame; + +} float turret_send(entity to, float sf) { - dprint("Sending update\n"); + WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET); WriteByte(MSG_ENTITY, sf); if(sf & TNSF_SETUP) @@ -990,6 +1005,8 @@ float turret_stdproc_init (string cvar_base_name, string base, string head, floa self.cvar_basename = cvar_base_name; load_unit_settings(self, self.cvar_basename, 0); + self.effects = EF_NODRAW; + // Handle turret teams. if (autocvar_g_assault != 0) { @@ -1300,6 +1317,7 @@ float turret_stdproc_init (string cvar_base_name, string base, string head, floa self.use(); } + //turret_link(); turret_stdproc_respawn(); if (!turret_tag_fire_update()) diff --git a/qcsrc/server/tturrets/units/unit_walker.qc b/qcsrc/server/tturrets/units/unit_walker.qc index 740761e3e..7fddd5799 100644 --- a/qcsrc/server/tturrets/units/unit_walker.qc +++ b/qcsrc/server/tturrets/units/unit_walker.qc @@ -12,51 +12,12 @@ #define ANIM_ROAM 11 .float animflag; -.entity wkr_spawn; #define WALKER_MIN '-70 -70 0' #define WALKER_MAX '70 70 95' #define WALKER_PATH(s,e) pathlib_astar(s,e) -float walker_meele_dmg; -float walker_meele_force; - -float walker_speed_stop; -float walker_speed_walk; -float walker_speed_run; -float walker_speed_jump; -float walker_speed_roam; -float walker_speed_swim; - -float walker_std_rocket_dmg; -float walker_std_rocket_radius; -float walker_std_rocket_force; -float walker_std_rocket_speed; -float walker_std_rocket_turnrate; - -void walker_loadcvars() -{ - walker_meele_dmg = autocvar_g_turrets_unit_walker_std_meele_dmg; - walker_meele_force = autocvar_g_turrets_unit_walker_std_meele_force; - - walker_speed_stop = autocvar_g_turrets_unit_walker_speed_stop; - walker_speed_walk = autocvar_g_turrets_unit_walker_speed_walk; - walker_speed_run = autocvar_g_turrets_unit_walker_speed_run; - walker_speed_jump = autocvar_g_turrets_unit_walker_speed_jump; - walker_speed_roam = autocvar_g_turrets_unit_walker_speed_roam; - walker_speed_swim = autocvar_g_turrets_unit_walker_speed_swim; - - walker_std_rocket_dmg = autocvar_g_turrets_unit_walker_std_rocket_dmg; - walker_std_rocket_radius = autocvar_g_turrets_unit_walker_std_rocket_radius; - walker_std_rocket_force = autocvar_g_turrets_unit_walker_std_rocket_force; - walker_std_rocket_speed = autocvar_g_turrets_unit_walker_std_rocket_speed; - walker_std_rocket_turnrate = autocvar_g_turrets_unit_walker_std_rocket_turnrate; - -} - - - float walker_firecheck() { if (self.animflag == ANIM_MEELE) @@ -69,33 +30,24 @@ void walker_meele_do_dmg() { vector where; entity e; + makevectors(self.angles); where = self.origin + v_forward * 128; - //w_deathtypestring = "tried to hug the cute spider thingy."; e = findradius(where,32); while (e) { if (turret_validate_target(self,e,self.target_validate_flags)) if (e != self && e.owner != self) - Damage(e, self, self, walker_meele_dmg ,DEATH_TURRET,'0 0 0', v_forward * walker_meele_force); + Damage(e, self, self, autocvar_g_turrets_unit_walker_std_meele_dmg ,DEATH_TURRET,'0 0 0', v_forward * autocvar_g_turrets_unit_walker_std_meele_force); e = e.chain; } } void walker_setnoanim() { - self.frame = ANIM_NO; + turrets_setframe(ANIM_NO, FALSE); self.animflag = self.owner.frame; - dprint("walker_setnoanim\n"); - -} - -void walker_dly_meele_do_dmg() -{ - walker_meele_do_dmg(); - dprint("walker_dly_meele_do_dmg\n"); - } void walker_animate() @@ -111,19 +63,13 @@ void walker_animate() if (self.tur_head.frame > 12) self.tur_head.frame = 0; - - if(self.frame != self.animflag) - { - self.SendFlags |= TNSF_ANIM; - self.anim_start_time = time; - } - + switch (self.animflag) { case ANIM_NO: - self.frame = 0; - movelib_beak_simple(walker_speed_stop); + turrets_setframe(0, FALSE); + movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop); break; /* @@ -132,7 +78,7 @@ void walker_animate() self.frame = 25; self.frame = self.frame -1; - movelib_move_simple(v_forward * -1, walker_speed_walk, 0.6); + movelib_move_simple(v_forward * -1, autocvar_g_turrets_unit_walker_speed_walk, 0.6); if (self.frame < 5) self.frame = 25; @@ -141,75 +87,63 @@ void walker_animate() */ case ANIM_TURN: - self.frame = ANIM_TURN; self.angles_y += bound(-15, shortangle_f(real_angle_y, self.angles_y), 15); - movelib_beak_simple(walker_speed_stop); + movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop); break; case ANIM_WALK: - self.frame = ANIM_WALK; self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10); - movelib_move_simple(v_forward, walker_speed_walk, 0.6); + movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_walk, 0.6); break; case ANIM_RUN: - self.frame = ANIM_RUN; self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5); - movelib_move_simple(v_forward, walker_speed_run, 0.6); + movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_run, 0.6); break; case ANIM_STRAFE_L: - self.frame = ANIM_STRAFE_L; self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5); - movelib_move_simple(v_right * -1, walker_speed_walk, 0.8); + movelib_move_simple(v_right * -1, autocvar_g_turrets_unit_walker_speed_walk, 0.8); break; case ANIM_STRAFE_R: - self.frame = ANIM_STRAFE_R; self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5); - movelib_move_simple(v_right, walker_speed_walk, 0.8); + movelib_move_simple(v_right, autocvar_g_turrets_unit_walker_speed_walk, 0.8); break; case ANIM_JUMP: - self.frame = ANIM_JUMP; - self.velocity += '0 0 1' * walker_speed_jump; + self.velocity += '0 0 1' * autocvar_g_turrets_unit_walker_speed_jump; break; case ANIM_LAND: - self.frame = ANIM_LAND; break; case ANIM_PAIN: if(self.frame != ANIM_PAIN) - defer(0.25,walker_setnoanim); - - self.frame = ANIM_PAIN; - + defer(0.25, walker_setnoanim); + break; case ANIM_MEELE: if(self.frame != ANIM_MEELE) { defer(0.41, walker_setnoanim); - defer(0.21, walker_dly_meele_do_dmg); + defer(0.21, walker_meele_do_dmg); } - self.frame = ANIM_MEELE; - movelib_beak_simple(walker_speed_stop); + movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop); break; case ANIM_SWIM: - self.frame = ANIM_SWIM; self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10); self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10); - movelib_move_simple(v_forward, walker_speed_swim, 0.3); + movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_swim, 0.3); vz = self.velocity_z + sin(time * 4) * 8; break; case ANIM_ROAM: - self.frame = ANIM_ROAM; self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5); - movelib_move_simple(v_forward ,walker_speed_roam, 0.5); + movelib_move_simple(v_forward ,autocvar_g_turrets_unit_walker_speed_roam, 0.5); break; } @@ -238,7 +172,7 @@ void walker_rocket_explode() org2 = findbetterlocation (self.origin, 16); pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1); - RadiusDamage (self, self.owner, walker_std_rocket_dmg, 0, walker_std_rocket_radius, world,walker_std_rocket_force, DEATH_TURRET, world); + RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, world,autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET, world); remove (self); } @@ -251,7 +185,7 @@ void walker_rocket_damage (entity inflictor, entity attacker, float damage, floa walker_rocket_explode(); } -#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, walker_std_rocket_speed, walker_std_rocket_turnrate); UpdateCSQCProjectile(self) +#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, autocvar_g_turrets_unit_walker_std_rocket_speed, autocvar_g_turrets_unit_walker_std_rocket_turnrate); UpdateCSQCProjectile(self) void walker_rocket_loop(); void walker_rocket_think() { @@ -326,7 +260,7 @@ void walker_rocket_loop3() return; } - if (vlen(self.origin - self.tur_shotorg) < 128 ) + if (vlen(self.origin - self.tur_shotorg) < 100 ) { self.think = walker_rocket_think; return; @@ -350,7 +284,7 @@ void walker_rocket_loop2() return; } - if (vlen(self.origin - self.tur_shotorg) < 128 ) + if (vlen(self.origin - self.tur_shotorg) < 100 ) { self.tur_shotorg = self.origin - '0 0 200'; self.think = walker_rocket_loop3; @@ -364,7 +298,7 @@ void walker_rocket_loop2() void walker_rocket_loop() { self.nextthink = time; - self.tur_shotorg = self.origin + '0 0 400'; + self.tur_shotorg = self.origin + '0 0 300'; self.think = walker_rocket_loop2; self.shot_dmg = 1337; } @@ -410,7 +344,7 @@ void walker_fire_rocket(vector org) rocket.nextthink = time;// + 0.25; rocket.movetype = MOVETYPE_FLY; - rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * walker_std_rocket_speed; + rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * autocvar_g_turrets_unit_walker_std_rocket_speed; rocket.angles = vectoangles(rocket.velocity); rocket.touch = walker_rocket_explode; rocket.flags = FL_PROJECTILE; @@ -501,6 +435,7 @@ void walker_move_path() } +.vector enemy_last_loc; void walker_move_enemy() { switch (self.waterlevel) @@ -522,8 +457,9 @@ void walker_move_enemy() } self.moveto = self.enemy.origin; - self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95); - + self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95); + self.enemy_last_loc = self.enemy.origin; + } void walker_move_idle_pause() @@ -543,14 +479,12 @@ void walker_move_idle() float walker_attack_meele() { - vector wish_angle; - if (self.animflag == ANIM_SWIM || self.animflag == ANIM_MEELE) return 0; - wish_angle = angleofs(self,self.enemy); + wish_angle = angleofs(self, self.enemy); if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_meele_range) return 0; @@ -559,7 +493,7 @@ float walker_attack_meele() return 0; self.moveto = self.enemy.origin; - self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95); + self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95); self.animflag = ANIM_MEELE; return 1; @@ -591,10 +525,7 @@ float walker_attack_rockets() void walker_postthink() { - - //self.angles_x *= -1; fixedmakevectors(self.angles); - //self.angles_x *= -1; if ((self.spawnflags & TSF_NO_PATHBREAK) && self.pathcurrent) walker_move_path(); @@ -617,46 +548,36 @@ void walker_postthink() walker_animate(); - //if(vlen(self.velocity)) - self.SendFlags |= TNSF_MOVE; + if(self.origin != self.oldorigin) + self.SendFlags |= TNSF_MOVE; + + self.oldorigin = self.origin; + turrets_setframe(self.animflag, FALSE); } void walker_attack() { sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM); - fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant); + fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant); endFireBallisticBullet(); - if (self.misc_bulletcounter == 2) - { - - UziFlash(); - setattachment(self.muzzle_flash, self.tur_head, "tag_fire"); - - self.misc_bulletcounter = 0; - } - - self.misc_bulletcounter = self.misc_bulletcounter + 1; + pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1); + self.tur_head.frame = self.tur_head.frame + 1; } void walker_respawnhook() { - vector vtmp; entity e; // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn. if(self.movetype != MOVETYPE_WALK) return; - setorigin(self, self.wkr_spawn.origin); - - self.angles = self.wkr_spawn.angles; - vtmp = self.wkr_spawn.origin; - vtmp_z += self.wkr_spawn.maxs_z; - setorigin(self,vtmp); - + setorigin(self, self.pos1); + self.angles = self.pos2; + if (self.target != "") { e = find(world,targetname,self.target); @@ -674,21 +595,15 @@ void walker_respawnhook() self.pathgoal = e; } } + self.colormod = randomvec() * 5; } void walker_diehook() { - //turret_trowgib2(self.origin, self.velocity + v_up * 200, '-0.6 -0.2 -02', self,time + random() * 1); - //turret_trowgib2(self.origin + '0 0 64', self.velocity + v_forward * 150 + v_up * 150, '-0.2 -0.2 -02', self.tur_head, 3 + time + random() * 2); - if (self.pathcurrent) pathlib_deletepath(self.pathcurrent.owner); self.pathcurrent = world; - - if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN) - remove(self.wkr_spawn); - } void turret_walker_dinit() @@ -697,7 +612,6 @@ void turret_walker_dinit() entity e; if (self.netname == "") self.netname = "Walker Turret"; - self.wkr_spawn = spawn(); self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE; self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE ; @@ -728,20 +642,15 @@ void turret_walker_dinit() self.solid = SOLID_SLIDEBOX; self.takedamage = DAMAGE_AIM; - setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3"); - - self.wkr_spawn.angles = self.angles; - self.wkr_spawn.solid = SOLID_NOT; setsize(self, WALKER_MIN, WALKER_MAX); - setorigin(self,self.origin); - //traceline(self.origin + '0 0 128', self.origin - '0 0 10000', MOVE_NORMAL, self); + setorigin(self, self.origin); tracebox(self.origin + '0 0 128', self.mins,self.maxs,self.origin - '0 0 10000', MOVE_NORMAL, self); - - setorigin(self.wkr_spawn, trace_endpos + '0 0 4'); - setorigin(self, self.wkr_spawn.origin); - + setorigin(self, trace_endpos + '0 0 4'); + self.pos1 = self.origin; + self.pos2 = self.angles; + self.idle_aim = '0 0 0'; self.turret_firecheckfunc = walker_firecheck; self.turret_firefunc = walker_attack; @@ -769,14 +678,10 @@ void turret_walker_dinit() void spawnfunc_turret_walker() { - walker_loadcvars(); - g_turrets_common_precash(); precache_model ("models/turrets/walker_head_minigun.md3"); precache_model ("models/turrets/walker_body.md3"); - precache_model ("models/turrets/walker_props.md3"); - precache_model ("models/turrets/walker_spawn.md3"); precache_model ( "models/turrets/rocket.md3"); precache_sound ( "weapons/rocket_impact.wav" ); diff --git a/unit_walker.cfg b/unit_walker.cfg index 607553c8e..7c36d0eb0 100644 --- a/unit_walker.cfg +++ b/unit_walker.cfg @@ -45,11 +45,11 @@ set g_turrets_unit_walker_std_track_type 1 set g_turrets_unit_walker_std_rockets_range 4000 set g_turrets_unit_walker_std_rockets_range_min 500 set g_turrets_unit_walker_std_rocket_refire 10 -set g_turrets_unit_walker_std_rocket_dmg 50 +set g_turrets_unit_walker_std_rocket_dmg 45 set g_turrets_unit_walker_std_rocket_radius 150 set g_turrets_unit_walker_std_rocket_force 150 -set g_turrets_unit_walker_std_rocket_turnrate 0.4 -set g_turrets_unit_walker_std_rocket_speed 900 +set g_turrets_unit_walker_std_rocket_turnrate 0.1 +set g_turrets_unit_walker_std_rocket_speed 1000 // Meele attack. Only happens when theres a target directly in front set g_turrets_unit_walker_std_meele_range 100 -- 2.39.2