self.hook_length = -1;
}
+.vector hook_start, hook_end;
+float GrapplingHookSend(entity to, float sf)
+{
+ WriteByte(MSG_ENTITY, ENT_CLIENT_HOOK);
+ sf = sf & 0x7F;
+ if(sound_allowed(MSG_BROADCAST, self.owner))
+ sf |= 0x80;
+ WriteByte(MSG_ENTITY, sf);
+ if(sf & 1)
+ {
+ WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+ }
+ if(sf & 2)
+ {
+ WriteCoord(MSG_ENTITY, self.hook_start_x);
+ WriteCoord(MSG_ENTITY, self.hook_start_y);
+ WriteCoord(MSG_ENTITY, self.hook_start_z);
+ }
+ if(sf & 4)
+ {
+ WriteCoord(MSG_ENTITY, self.hook_end_x);
+ WriteCoord(MSG_ENTITY, self.hook_end_y);
+ WriteCoord(MSG_ENTITY, self.hook_end_z);
+ }
+ return TRUE;
+}
+
void GrapplingHookThink()
{
float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch, s;
if(self.state == 1)
{
- pullspeed = cvar("g_balance_grapplehook_speed_pull");//2000;
+ pullspeed = autocvar_g_balance_grapplehook_speed_pull;//2000;
// speed the rope is pulled with
- rubberforce = cvar("g_balance_grapplehook_force_rubber");//2000;
+ rubberforce = autocvar_g_balance_grapplehook_force_rubber;//2000;
// force the rope will use if it is stretched
- rubberforce_overstretch = cvar("g_balance_grapplehook_force_rubber_overstretch");//1000;
+ rubberforce_overstretch = autocvar_g_balance_grapplehook_force_rubber_overstretch;//1000;
// force the rope will use if it is stretched
- minlength = cvar("g_balance_grapplehook_length_min");//100;
+ minlength = autocvar_g_balance_grapplehook_length_min;//100;
// minimal rope length
// if the rope goes below this length, it isn't pulled any more
- ropestretch = cvar("g_balance_grapplehook_stretch");//400;
+ ropestretch = autocvar_g_balance_grapplehook_stretch;//400;
// if the rope is stretched by more than this amount, more rope is
// given to you again
- ropeairfriction = cvar("g_balance_grapplehook_airfriction");//0.2
+ ropeairfriction = autocvar_g_balance_grapplehook_airfriction;//0.2
// while hanging on the rope, this friction component will help you a
// bit to control the rope
dist = vlen(dir);
dir = normalize(dir);
- if(cvar("g_grappling_hook_tarzan"))
+ if(autocvar_g_grappling_hook_tarzan)
{
v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity);
v = v + frametime * dir * spd * rubberforce;
dv = ((v - v0) * dir) * dir;
- if(cvar("g_grappling_hook_tarzan") >= 2)
+ if(autocvar_g_grappling_hook_tarzan >= 2)
{
if(self.aiment.movetype == MOVETYPE_WALK)
{
self.aiment.velocity = self.aiment.velocity - dv * 0.5;
self.aiment.flags &~= FL_ONGROUND;
self.aiment.pusher = self.owner;
- self.aiment.pushltime = time + cvar("g_maxpushtime");
+ self.aiment.pushltime = time + autocvar_g_maxpushtime;
}
}
}
makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
- myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin) + v_forward * (-9);
-
- // TODO turn into a csqc entity
- WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte(MSG_BROADCAST, TE_CSQC_BEAM);
- WriteByte(MSG_BROADCAST, num_for_edict(self.owner));
- WriteByte(MSG_BROADCAST, 0);
- WriteCoord(MSG_BROADCAST, myorg_x);
- WriteCoord(MSG_BROADCAST, myorg_y);
- WriteCoord(MSG_BROADCAST, myorg_z);
- WriteCoord(MSG_BROADCAST, org_x);
- WriteCoord(MSG_BROADCAST, org_y);
- WriteCoord(MSG_BROADCAST, org_z);
+ myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin); // + v_forward * (-9);
+
+ if(myorg != self.hook_start)
+ {
+ self.SendFlags |= 2;
+ self.hook_start = myorg;
+ }
+ if(org != self.hook_end)
+ {
+ self.SendFlags |= 4;
+ self.hook_end = org;
+ }
}
void GrapplingHookTouch (void)
if(attacker != self.owner)
{
self.owner.pusher = attacker;
- self.owner.pushltime = time + cvar("g_maxpushtime");
+ self.owner.pushltime = time + autocvar_g_maxpushtime;
}
RemoveGrapplingHook(self.owner);
}
// UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
sound (self, CHAN_WEAPON2, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
org = self.origin + self.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
+
+ tracebox(self.origin + self.view_ofs, '-3 -3 -3', '3 3 3', org, MOVE_NORMAL, self);
+ org = trace_endpos;
+
pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
missile = WarpZone_RefSys_SpawnSameRefSys(self);
missile.movetype = MOVETYPE_FLY;
PROJECTILE_MAKETRIGGER(missile);
- setmodel (missile, "models/hook.md3"); // precision set below
+ //setmodel (missile, "models/hook.md3"); // precision set below
setsize (missile, '-3 -3 -3', '3 3 3');
setorigin (missile, org);
missile.state = 0; // not latched onto anything
- W_SetupProjectileVelocityEx(missile, v_forward, v_up, cvar("g_balance_grapplehook_speed_fly"), 0, 0, 0);
+ W_SetupProjectileVelocityEx(missile, v_forward, v_up, autocvar_g_balance_grapplehook_speed_fly, 0, 0, 0, FALSE);
missile.angles = vectoangles (missile.velocity);
//missile.glow_color = 250; // 244, 250
missile.effects = /*EF_FULLBRIGHT | EF_ADDITIVE |*/ EF_LOWPRECISION;
- missile.health = cvar("g_balance_grapplehook_health");//120
+ missile.health = autocvar_g_balance_grapplehook_health;//120
missile.event_damage = GrapplingHook_Damage;
missile.takedamage = DAMAGE_AIM;
missile.damageforcescale = 0;
+
+ missile.hook_start = missile.hook_end = missile.origin;
+
+ Net_LinkEntity(missile, FALSE, 0, GrapplingHookSend);
}
// void GrapplingHookFrame()