]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - data/qcsrc/server/vore.qc
I think Jump is a more appropriate key for getting out than Alt Fire. Also don't...
[voretournament/voretournament.git] / data / qcsrc / server / vore.qc
index 1a3fa9e40f4bd1fc1d47969e77ca3c291ace4702..102ce98b43a16b77a921b44533804d5c8b1f8ad8 100644 (file)
@@ -56,6 +56,13 @@ float Swallow_condition_check(entity prey)
        return FALSE;\r
 }\r
 \r
+float Vore_PreyCanLeave()\r
+{\r
+       if(teams_matter && self.team == self.eater.team)\r
+               return TRUE;\r
+       return FALSE;\r
+}\r
+\r
 // make the camera smoothly lower itself when we get swallowed\r
 // the target we are going for is from normal view offset to half of the view offset (because half is the best positioning of the view for the stomach model)\r
 .float cameraeffect_current, cameraeffect_target;\r
@@ -74,6 +81,7 @@ void Vore_CameraEffect_Apply()
                local float step;\r
                step = self.cvar_cl_vore_cameraspeed * frametime;\r
 \r
+               // not sure if these maths are good, as the effect should be smoother\r
                if(self.cameraeffect_current >= self.cameraeffect_target + step)\r
                        self.cameraeffect_current -= step;\r
                else if(self.cameraeffect_current <= self.cameraeffect_target - step)\r
@@ -96,6 +104,8 @@ void Vore_Weight_apply(entity e)
        e.vore_oldstomachload = e.stomach_load;\r
 }\r
 \r
+.entity pusher;\r
+.float pushltime;\r
 void Vore_Swallow(entity e)\r
 {\r
        // this player is beening swallowed by another player, apply the proper changes\r
@@ -103,6 +113,7 @@ void Vore_Swallow(entity e)
        e.vore_oldsolid = e.solid;\r
        e.vore_oldview_ofs_z = e.view_ofs_z;\r
 \r
+       e.eater = self;\r
        setorigin(e, e.eater.origin);\r
        e.velocity = '0 0 0';\r
        e.movetype = MOVETYPE_FOLLOW;\r
@@ -110,25 +121,31 @@ void Vore_Swallow(entity e)
        e.alpha = -1; // best way of hiding / showing the eaten player\r
        e.aiment = e.eater; // follow the predator. Is automatically unset\r
 \r
-       /*e.cameraeffect_current = e.view_ofs_z * 2;\r
-       e.cameraeffect_target = e.view_ofs_z / 2; // best positioning for the stomach model*/\r
-\r
-       Vore_CameraEffect_Set(e);\r
-\r
        // drop keys (KH) and flags (CTF) when we get swallowed\r
        kh_Key_DropAll(e, FALSE);\r
        if(e.flagcarried)\r
                DropFlag(e.flagcarried, world, e.eater);\r
 \r
+       Vore_CameraEffect_Set(e);\r
+\r
        if(stov(cvar_string("g_vore_regurgitatecolor_released")))\r
                e.colormod = stov(cvar_string("g_vore_regurgitatecolor_released"));\r
 \r
+       if(e.team == e.eater.team && teamplay)\r
+       {\r
+               centerprint(e, "^3You have been swallowed by a team mate, don't kick!");\r
+               centerprint(e.eater, "^3You have swallowed a team mate, use caution!");\r
+       }\r
+\r
        PlayerSound(e.eater, playersound_swallow, CHAN_PAIN, VOICETYPE_PLAYERSOUND);\r
-       setanim(e.eater, e.eater.anim_pain1, FALSE, TRUE, TRUE); // looks good for swallowing \ regurgitating\r
+       setanim(e.eater, e.eater.anim_pain1, FALSE, TRUE, TRUE); // looks good for swallowing / regurgitating\r
        e.eater.stomach_load += 1;\r
        e.eater.regurgitate_prepare = 0;\r
        Vore_Weight_apply(e.eater);\r
 \r
+       // block firing for a small amount of time when voring, or we'll be firing the next frame after we swallow\r
+       e.eater.weapon_delay = time + button_delay;\r
+       e.eater.swallow_delay = time + cvar("g_balance_vore_swallow_delay");\r
        e.system_delay = e.eater.system_delay = time + system_delay_time;\r
 }\r
 \r
@@ -141,8 +158,6 @@ void Vore_Regurgitate(entity e)
        e.view_ofs_z = e.vore_oldview_ofs_z;\r
        e.alpha = default_player_alpha; // best way of hiding / showing the eaten player\r
 \r
-       //e.view_ofs_z *= 2; // best positioning for the stomach model\r
-\r
        // velocities\r
        local vector oldforward, oldright, oldup;\r
        oldforward = v_forward;\r
@@ -155,14 +170,19 @@ void Vore_Regurgitate(entity e)
        v_right = oldright;\r
        v_up = oldup;\r
 \r
+       e.pusher = e.eater; // so we can frag players by regurgitating them in deadly pits\r
+       e.pushltime = time + cvar("g_maxpushtime");\r
+\r
        PlayerSound(e.eater, playersound_regurgitate, CHAN_PAIN, VOICETYPE_PLAYERSOUND);\r
-       setanim(e.eater, e.eater.anim_pain1, FALSE, TRUE, TRUE); // looks good for swallowing \ regurgitating\r
+       setanim(e.eater, e.eater.anim_pain1, FALSE, TRUE, TRUE); // looks good for swallowing / regurgitating\r
        pointparticles(particleeffectnum("regurgitate"), e.eater.origin, '0 0 0', 1);\r
        e.eater.stomach_load -= 1;\r
        e.eater.regurgitate_prepare = 0;\r
        e.eater.swallow_delay = time + cvar("g_balance_vore_swallow_delay");\r
        Vore_Weight_apply(e.eater);\r
 \r
+       // block firing for a small amount of time when getting regurgitated, or we'll be firing the next frame\r
+       e.weapon_delay = time + button_delay;\r
        e.system_delay = e.eater.system_delay = time + system_delay_time;\r
        e.eater = world;\r
 }\r
@@ -175,7 +195,7 @@ void Vore_Disconnect()
        // prey disconnects or goes spectating while inside someone's belly:\r
        if(self.eater.classname == "player")\r
        {\r
-               self.view_ofs_z += 25;\r
+               self.view_ofs_z = self.vore_oldview_ofs_z;\r
                self.eater.stomach_load -= 1;\r
                Vore_Weight_apply(self.eater);\r
                self.eater = world;\r
@@ -231,12 +251,10 @@ void Vore_Teamheal()
 .float stomachkick_delay;\r
 void Vore_StomachKick()\r
 {\r
-       // allows prey to kick the predator's stomach and do some damage / attempt to escape, or bring the predator's digestion upon their self when there's no other option\r
+       // allows prey to kick the predator's stomach and do some damage or attempt to escape\r
        if(self.eater.classname != "player")\r
                return;\r
 \r
-       // kick the predator's stomach and do damage, or escape if we are lucky\r
-       if(self.BUTTON_ATCK)\r
        if(time > self.stomachkick_delay)\r
        {\r
                float damage;\r
@@ -249,12 +267,19 @@ void Vore_StomachKick()
 \r
                self.stomachkick_delay = time + cvar("g_balance_vore_kick_delay");\r
        }\r
+}\r
+\r
+void Vore_StomachLeave()\r
+{\r
+       // allows players to get out of their predator at will in some circumstances, such as team mates\r
 \r
-       // start the predator's digestion\r
-       if(self.BUTTON_ATCK2)\r
+       if(Vore_PreyCanLeave())\r
+               Vore_Regurgitate(self);\r
+       else if(time > self.complain_swallow)\r
        {\r
-               centerprint(self.eater, strcat(self.netname, " has triggered your digestion"));\r
-               self.eater.digesting = TRUE;\r
+               play2(self, "weapons/unavailable.wav");\r
+               sprint(self, strcat("You can't willingly get out of ", self.eater.netname, "\n"));\r
+               self.complain_swallow = time + complain_delay;\r
        }\r
 }\r
 \r
@@ -307,17 +332,7 @@ void Vore()
        // attempt to swallow our new prey if there's any in range\r
        if(self.BUTTON_ATCK && !self.BUTTON_REGURGITATE && self.swallow_delay < time)\r
        if(Swallow_condition_check(prey))\r
-       {\r
-               prey.eater = self;\r
                Vore_Swallow(prey);\r
-               self.swallow_delay = time + cvar("g_balance_vore_swallow_delay");\r
-\r
-               if(self.team == prey.team && teamplay)\r
-                       centerprint(self, "You have swallowed a team mate, use caution!");\r
-\r
-               // block firing for a small amount of time when voring, or we'll be firing the next frame after we swallow\r
-               self.weapon_delay = time + 0.25;\r
-       }\r
 \r
        // start / stop digestion on command, if the player has someone in their stomach\r
        if(self.BUTTON_DIGEST)\r
@@ -348,7 +363,7 @@ void Vore()
                        if(time > self.regurgitate_button_delay)\r
                        {\r
                                self.regurgitate_prepare = time + cvar("g_balance_vore_regurgitate_delay");\r
-                               PlayerSound(self, playersound_regurgitate_prepare, CHAN_PAIN, VOICETYPE_PLAYERSOUND);\r
+                               PlayerSound(self, playersound_regurgitate_prepare, CHAN_VOICE, VOICETYPE_PLAYERSOUND);\r
                                self.regurgitate_button_delay = time + button_delay;\r
                        }\r
                }\r
@@ -373,7 +388,20 @@ void Vore()
        if(self.eater.deadflag || self.deadflag)\r
                Vore_Regurgitate(self);\r
        else if(self.eater.eater.classname == "player") // don't allow a player inside a player inside another player :)\r
+       {\r
+               entity targeteater, oldself;\r
+               targeteater = self.eater.eater;\r
+\r
                Vore_Regurgitate(self);\r
+               if(random() < cvar("g_vore_stealprey"))\r
+               if(Swallow_condition_check(self))\r
+               {\r
+                       oldself = self;\r
+                       self = targeteater;\r
+                       Vore_Swallow(oldself);\r
+                       self = oldself;\r
+               }\r
+       }\r
        else if(vlen(self.eater.velocity) > cvar("g_balance_vore_regurgitate_velocitylimit"))\r
                Vore_Regurgitate(self);\r
 \r
@@ -390,7 +418,12 @@ void Vore()
        if(teams_matter && self.team == self.eater.team)\r
                Vore_Teamheal();\r
 \r
-       Vore_StomachKick();\r
+       if(self.BUTTON_ATCK)\r
+               Vore_StomachKick();\r
+       else if(self.BUTTON_JUMP)\r
+               Vore_StomachLeave();\r
+\r
+       self.stat_canleave = Vore_PreyCanLeave();\r
 \r
        Vore_CameraEffect_Apply();\r
 }
\ No newline at end of file