Player: Move UseUp/Down into the base_player class. Should now universally handle un-presses for all games.
This commit is contained in:
parent
87d9614b23
commit
607194957e
6 changed files with 121 additions and 18 deletions
|
@ -26,9 +26,9 @@ Game_Input(player pl)
|
|||
}
|
||||
|
||||
if (input_buttons & INPUT_BUTTON5)
|
||||
Player_UseDown();
|
||||
pl.InputUse_Down();
|
||||
else
|
||||
Player_UseUp();
|
||||
pl.InputUse_Up();
|
||||
|
||||
if (pl.impulse == 100)
|
||||
Flashlight_Toggle();
|
||||
|
|
|
@ -111,7 +111,7 @@ class func_button:NSSurfacePropEntity
|
|||
virtual void(entity) Blocked;
|
||||
virtual void(entity, int) Trigger;
|
||||
virtual void(void) DeathTrigger;
|
||||
virtual void(void) Use;
|
||||
virtual void(void) PlayerUse;
|
||||
|
||||
virtual void(void) SetMovementDirection;
|
||||
virtual void(vector, void(void)) MoveToDestination;
|
||||
|
@ -337,8 +337,11 @@ func_button::Touch(entity eToucher)
|
|||
}
|
||||
|
||||
void
|
||||
func_button::Use(void)
|
||||
func_button::PlayerUse(void)
|
||||
{
|
||||
if (HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
|
||||
return;
|
||||
}
|
||||
Trigger(eActivator, TRIG_TOGGLE);
|
||||
}
|
||||
|
||||
|
@ -425,12 +428,6 @@ func_button::Respawn(void)
|
|||
m_flSpeed = 100;
|
||||
}
|
||||
|
||||
if (HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
|
||||
PlayerUse = __NULL__;
|
||||
} else {
|
||||
PlayerUse = Use;
|
||||
}
|
||||
|
||||
m_vecPos1 = GetSpawnOrigin();
|
||||
|
||||
if (HasSpawnFlags(SF_BTT_NOMOVE)) {
|
||||
|
|
|
@ -113,7 +113,7 @@ class func_door:NSRenderableEntity
|
|||
virtual void(entity, int) Trigger;
|
||||
virtual void(entity) Blocked;
|
||||
virtual void(entity) Touch;
|
||||
virtual void(void) Use;
|
||||
virtual void(void) PlayerUse;
|
||||
virtual void(float) Save;
|
||||
virtual void(string, string) Restore;
|
||||
virtual void(string, string) SpawnKey;
|
||||
|
@ -141,8 +141,11 @@ func_door::PortalClose(void)
|
|||
}
|
||||
|
||||
void
|
||||
func_door::Use(void)
|
||||
func_door::PlayerUse(void)
|
||||
{
|
||||
if (!HasSpawnFlags(SF_MOV_USE))
|
||||
return;
|
||||
|
||||
eActivator.flags &= ~FL_USE_RELEASED;
|
||||
Trigger(eActivator, TRIG_TOGGLE);
|
||||
}
|
||||
|
@ -398,6 +401,7 @@ func_door::Respawn(void)
|
|||
SetMovetype(MOVETYPE_PUSH);
|
||||
SetModel(GetSpawnModel());
|
||||
SetOrigin(GetSpawnOrigin());
|
||||
flags |= FL_FINDABLE_NONSOLID;
|
||||
|
||||
think = __NULL__;
|
||||
nextthink = 0.0f;
|
||||
|
@ -415,12 +419,6 @@ func_door::Respawn(void)
|
|||
m_iDamage = 2;
|
||||
}
|
||||
|
||||
if (HasSpawnFlags(SF_MOV_USE)) {
|
||||
PlayerUse = Use;
|
||||
} else {
|
||||
PlayerUse = __NULL__;
|
||||
}
|
||||
|
||||
m_iValue = 0;
|
||||
m_iState = DOORSTATE_LOWERED;
|
||||
m_vecPos1 = GetSpawnOrigin();
|
||||
|
|
|
@ -218,6 +218,7 @@ func_rot_button::Respawn(void)
|
|||
SetOrigin(GetSpawnOrigin());
|
||||
SetAngles(GetSpawnAngles());
|
||||
PlayerUse = OnPlayerUse;
|
||||
flags |= FL_FINDABLE_NONSOLID;
|
||||
|
||||
m_iState = ROTBTNSTATE_OPENED;
|
||||
think = __NULL__;
|
||||
|
|
|
@ -113,5 +113,8 @@ base_player:spectator
|
|||
virtual void(void) Death;
|
||||
virtual void(void) MakePlayer;
|
||||
virtual void(void) MakeTempSpectator;
|
||||
|
||||
virtual void(void) InputUse_Down;
|
||||
virtual void(void) InputUse_Up;
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -789,6 +789,110 @@ base_player::SendEntity(entity ePEnt, float fChanged)
|
|||
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
_base_player_useworkaround
|
||||
|
||||
A wrapper to cleanly reset 'self' as to not mess up the QC VM
|
||||
====================
|
||||
*/
|
||||
void
|
||||
_base_player_useworkaround(entity eTarget)
|
||||
{
|
||||
eActivator = self;
|
||||
entity eOldSelf = self;
|
||||
self = eTarget;
|
||||
self.PlayerUse();
|
||||
self = eOldSelf;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
_base_player_useworkaround
|
||||
|
||||
A wrapper to cleanly reset 'self' as to not mess up the QC VM
|
||||
====================
|
||||
*/
|
||||
void
|
||||
_base_player_unuseworkaround(entity eTarget)
|
||||
{
|
||||
eActivator = self;
|
||||
entity eOldSelf = self;
|
||||
self = eTarget;
|
||||
if (self.PlayerUseUnpressed)
|
||||
self.PlayerUseUnpressed();
|
||||
self = eOldSelf;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
base_player:: InputUse_Down
|
||||
|
||||
Called when we hold down the +use button for the first time
|
||||
=================
|
||||
*/
|
||||
void
|
||||
base_player::InputUse_Down(void)
|
||||
{
|
||||
if (health <= 0) {
|
||||
return;
|
||||
} else if (!(flags & FL_USE_RELEASED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
vector vecSource;
|
||||
entity eRad;
|
||||
|
||||
makevectors(v_angle);
|
||||
vecSource = origin + view_ofs;
|
||||
traceline(vecSource, vecSource + (v_forward * 64), MOVE_EVERYTHING, this);
|
||||
|
||||
/* find anything in a 8 unit radius, including certain non-solids (func_door, func_rot_button etc. */
|
||||
eRad = findradius(trace_endpos, 8);
|
||||
bool found_use = false;
|
||||
|
||||
/* loop through our chain and just pick the first valid one */
|
||||
while (eRad) {
|
||||
if (eRad.PlayerUse) {
|
||||
found_use = true;
|
||||
break;
|
||||
}
|
||||
eRad = eRad.chain;
|
||||
}
|
||||
|
||||
/* TODO: maybe eRad will return something in the future that'll suppress a successfull use? */
|
||||
if (eRad && found_use == true) {
|
||||
flags &= ~FL_USE_RELEASED;
|
||||
_base_player_useworkaround(eRad);
|
||||
last_used = eRad;
|
||||
|
||||
/* Some entities want to support Use spamming */
|
||||
if (!(flags & FL_USE_RELEASED)) {
|
||||
sound(this, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE);
|
||||
}
|
||||
} else {
|
||||
sound(this, CHAN_ITEM, "common/wpn_denyselect.wav", 0.25, ATTN_IDLE);
|
||||
flags &= ~FL_USE_RELEASED;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
base_player:: InputUse_Down
|
||||
|
||||
Called when we let go of the +use button
|
||||
=================
|
||||
*/
|
||||
void
|
||||
base_player::InputUse_Up(void)
|
||||
{
|
||||
if (!(flags & FL_USE_RELEASED)) {
|
||||
_base_player_unuseworkaround(last_used);
|
||||
last_used = world;
|
||||
flags |= FL_USE_RELEASED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue