]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_hook.qc
Merge remote branch 'origin/fruitiex/fruitbalance'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_hook.qc
index 47c5e0568efd7ea89475691e3309f600cf78884e..ce3d9b72b8fe9db1f484e27ac4bc620d90bd3b53 100644 (file)
@@ -114,6 +114,33 @@ void GrapplingHook_Stop()
        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;
@@ -140,7 +167,7 @@ void GrapplingHookThink()
        vs = hook_shotorigin[s];
 
        makevectors(self.owner.v_angle);
-       org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * vs_y + v_up * vs_z;
+       org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
        myorg = WarpZone_RefSys_TransformOrigin(self.owner, self, org);
 
        if(self.hook_length < 0)
@@ -243,17 +270,16 @@ void GrapplingHookThink()
        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);
+       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)
@@ -316,7 +342,7 @@ void FireGrapplingHook (void)
 
        // 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;
+       org = self.origin + self.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
        pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
@@ -327,7 +353,7 @@ void FireGrapplingHook (void)
        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);
 
@@ -348,6 +374,10 @@ void FireGrapplingHook (void)
        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()
@@ -461,18 +491,18 @@ void GrappleHookInit()
 {
        if(g_grappling_hook)
        {
-               hook_shotorigin[0] = '8 -8 -12';
-               hook_shotorigin[1] = '8 -8 -12';
-               hook_shotorigin[2] = '8 -8 -12';
-               hook_shotorigin[3] = '8 -8 -12';
+               hook_shotorigin[0] = '8 8 -12';
+               hook_shotorigin[1] = '8 8 -12';
+               hook_shotorigin[2] = '8 8 -12';
+               hook_shotorigin[3] = '8 8 -12';
        }
        else
        {
                weapon_action(WEP_HOOK, WR_PRECACHE);
-               hook_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), TRUE, FALSE, 1);
-               hook_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), TRUE, FALSE, 2);
-               hook_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), TRUE, FALSE, 3);
-               hook_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), TRUE, FALSE, 4);
+               hook_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), FALSE, FALSE, 1);
+               hook_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), FALSE, FALSE, 2);
+               hook_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), FALSE, FALSE, 3);
+               hook_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_HOOK), FALSE, FALSE, 4);
        }
 }