Fix first-person view for hiders, fix hitbox/collision and restructure code.
- Moved disguise code into their own methods (setDisguiseModel, deleteDisguiseModel, updateDisguiseView). Thinking about moving into its own file to avoid overly complex GSC file. - Introducing player.isThirdPerson in order to keep track of the player's view. This allows determining whether the disguiseEntity should be hidden from the player's view or not. - Make the entity solid and correct the target damage so that players actually have the entity as a hitbox (watchDisguiseDamage). I tried to get hit markers to work properly but it's yet untested. - Improved tracing code to ignore the disguise entity since that entity is now solid (has collision).master
parent
1e9a663a2e
commit
890c5c0184
|
@ -365,13 +365,7 @@ onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHit
|
||||||
player = self;
|
player = self;
|
||||||
|
|
||||||
// If victim was disguised, reset him
|
// If victim was disguised, reset him
|
||||||
if (IsDefined(player.disguiseEntity))
|
player deleteDisguiseModel();
|
||||||
{
|
|
||||||
player.disguiseEntity Delete();
|
|
||||||
if (IsDefined(game["hiders_changed_sound"]))
|
|
||||||
player PlaySound(game["hiders_changed_sound"]);
|
|
||||||
player Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update spectator permissions
|
// Update spectator permissions
|
||||||
thread checkAllowSpectating();
|
thread checkAllowSpectating();
|
||||||
|
@ -683,6 +677,93 @@ handleHider() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setDisguiseModel(model, normalHealth)
|
||||||
|
{
|
||||||
|
logPrint("setDisguiseModel called");
|
||||||
|
|
||||||
|
player = self;
|
||||||
|
|
||||||
|
displayName = maps\mp\mods\_modellist::getDisplayName(model);
|
||||||
|
|
||||||
|
if (!IsDefined(player.disguiseEntity))
|
||||||
|
{
|
||||||
|
player Hide();
|
||||||
|
//player HideViewModel();
|
||||||
|
player.disguiseEntity = Spawn("script_model", player.origin);
|
||||||
|
//player.disguiseEntity LinkTo(player, "j_head", (0,0,0), (0,0,0));
|
||||||
|
player.disguiseEntity.team = player.team;
|
||||||
|
//player.disguiseEntity.pers["team"] = player.team;
|
||||||
|
player.disguiseEntity.owner = player.owner;
|
||||||
|
player.disguiseEntity Solid();
|
||||||
|
player.disguiseEntity SetCanDamage(true);
|
||||||
|
player thread watchDisguise("+melee");
|
||||||
|
player thread watchDisguiseDamage();
|
||||||
|
}
|
||||||
|
player.disguiseEntity SetModel(model);
|
||||||
|
player PingPlayer(); // flash on minimap for teammates
|
||||||
|
if (IsDefined(game["hiders_changed_sound"]))
|
||||||
|
player PlaySound(game["hiders_changed_sound"]);
|
||||||
|
|
||||||
|
|
||||||
|
if (IsDefined(normalHealth))
|
||||||
|
{
|
||||||
|
healthfrac = player.health / player.maxhealth;
|
||||||
|
newhealth = healthfrac * normalHealth;
|
||||||
|
player.health = newhealth;
|
||||||
|
player.maxhealth = normalHealth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Seems like changing model causes weapons to be reloaded
|
||||||
|
player TakeAllWeapons();
|
||||||
|
|
||||||
|
player updateDisguiseView();
|
||||||
|
|
||||||
|
//player SayTeam("(changed into " + displayName + ")");
|
||||||
|
player IPrintLnBold("^2You changed into ^4" + displayName);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteDisguiseModel()
|
||||||
|
{
|
||||||
|
logPrint("deleteDisguiseModel called");
|
||||||
|
|
||||||
|
player = self;
|
||||||
|
|
||||||
|
if (!IsDefined(player.disguiseEntity))
|
||||||
|
return;
|
||||||
|
|
||||||
|
player.disguiseEntity Delete();
|
||||||
|
if (IsDefined(game["hiders_changed_sound"]))
|
||||||
|
player PlaySound(game["hiders_changed_sound"]);
|
||||||
|
//player ShowViewModel();
|
||||||
|
player Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateDisguiseView()
|
||||||
|
{
|
||||||
|
logPrint("updateDisguiseView called");
|
||||||
|
|
||||||
|
player = self;
|
||||||
|
|
||||||
|
// Do we even have an entity?
|
||||||
|
if (!IsDefined(player.disguiseEntity))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Hide from third-person view of player
|
||||||
|
if (player.isThirdPerson)
|
||||||
|
{
|
||||||
|
player.disguiseEntity ShowToPlayer(player);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player.disguiseEntity Hide();
|
||||||
|
foreach (tplayer in level.players)
|
||||||
|
{
|
||||||
|
if (tplayer != player)
|
||||||
|
player.disguiseEntity ShowToPlayer(tplayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Binds a player command to let the player change between first
|
* Binds a player command to let the player change between first
|
||||||
* person view and third person view.
|
* person view and third person view.
|
||||||
|
@ -696,6 +777,8 @@ enableThirdPersonSwitch(playerCommand, value) {
|
||||||
player endon("death");
|
player endon("death");
|
||||||
player endon("disconnect");
|
player endon("disconnect");
|
||||||
|
|
||||||
|
player.isThirdPerson = value;
|
||||||
|
|
||||||
player notifyOnPlayerCommand("thirdpersonswitch_requested", playerCommand);
|
player notifyOnPlayerCommand("thirdpersonswitch_requested", playerCommand);
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -705,6 +788,10 @@ enableThirdPersonSwitch(playerCommand, value) {
|
||||||
// toggle third person mode
|
// toggle third person mode
|
||||||
value = !value;
|
value = !value;
|
||||||
player SetClientDvar("cg_thirdperson", value);
|
player SetClientDvar("cg_thirdperson", value);
|
||||||
|
player.isThirdPerson = value;
|
||||||
|
|
||||||
|
player updateDisguiseView();
|
||||||
|
|
||||||
wait 0.5;
|
wait 0.5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -737,7 +824,10 @@ enableModelChange(playerCommand) {
|
||||||
|
|
||||||
// Make a trace to the focused object
|
// Make a trace to the focused object
|
||||||
origin = (player GetOrigin()) + defaultOriginAdd;
|
origin = (player GetOrigin()) + defaultOriginAdd;
|
||||||
trace = BulletTrace(origin, origin + anglestoforward(player getplayerangles()) * 1000000, false, player);
|
ignore = player;
|
||||||
|
if (IsDefined(player.disguiseEntity))
|
||||||
|
ignore = player.disguiseEntity;
|
||||||
|
trace = BulletTrace(origin, origin + anglestoforward(player getplayerangles()) * 1000000, false, ignore);
|
||||||
if (!IsDefined(trace) || !IsDefined(trace["entity"]) || !IsDefined(trace["entity"].model) || !IsDefined(trace["entity"].classname))
|
if (!IsDefined(trace) || !IsDefined(trace["entity"]) || !IsDefined(trace["entity"].model) || !IsDefined(trace["entity"].classname))
|
||||||
{
|
{
|
||||||
player IPrintLnBold("^1Nothing to change into here.");
|
player IPrintLnBold("^1Nothing to change into here.");
|
||||||
|
@ -753,32 +843,9 @@ enableModelChange(playerCommand) {
|
||||||
player IPrintLnBold("^3You can't change into that!");
|
player IPrintLnBold("^3You can't change into that!");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
displayName = maps\mp\mods\_modellist::getDisplayName(trace["entity"].model);
|
|
||||||
|
|
||||||
healthfrac = player.health / player.maxhealth;
|
|
||||||
newhealth = healthfrac * (trace["entity"] GetNormalHealth());
|
|
||||||
|
|
||||||
if (!IsDefined(player.disguiseEntity))
|
|
||||||
{
|
|
||||||
player Hide();
|
|
||||||
player.disguiseEntity = Spawn("script_model", player.origin);
|
|
||||||
player thread watchDisguise("+melee");
|
|
||||||
}
|
|
||||||
player.disguiseEntity SetModel(trace["entity"].model);
|
|
||||||
player PingPlayer(); // flash on minimap for teammates
|
|
||||||
if (IsDefined(game["hiders_changed_sound"]))
|
|
||||||
player PlaySound(game["hiders_changed_sound"]);
|
|
||||||
|
|
||||||
player.health = newhealth;
|
|
||||||
player.maxhealth = trace["entity"] GetNormalHealth();
|
|
||||||
|
|
||||||
|
player setDisguiseModel(trace["entity"].model);
|
||||||
player SetClientDvar("cg_thirdpersonrange", 300);
|
player SetClientDvar("cg_thirdpersonrange", 300);
|
||||||
|
|
||||||
// Seems like changing model causes weapons to be reloaded
|
|
||||||
player TakeAllWeapons();
|
|
||||||
|
|
||||||
//player SayTeam("(changed into " + displayName + ")");
|
|
||||||
player IPrintLnBold("^2You changed into ^4" + displayName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,9 +866,6 @@ watchDisguise(angleLockingPlayerCommand)
|
||||||
player endon("death");
|
player endon("death");
|
||||||
player endon("disconnect");
|
player endon("disconnect");
|
||||||
|
|
||||||
//player.disguiseEntity LinkTo(player, "j_head", (0,0,0), (0,0,0));
|
|
||||||
player.disguiseEntity NotSolid();
|
|
||||||
|
|
||||||
player.disguiseAnglesLocked = false;
|
player.disguiseAnglesLocked = false;
|
||||||
player thread enableDisguiseModelAngleLocking(angleLockingPlayerCommand);
|
player thread enableDisguiseModelAngleLocking(angleLockingPlayerCommand);
|
||||||
|
|
||||||
|
@ -817,6 +881,33 @@ watchDisguise(angleLockingPlayerCommand)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
watchDisguiseDamage()
|
||||||
|
{
|
||||||
|
logPrint("watchDisguiseDamage called");
|
||||||
|
|
||||||
|
player = self;
|
||||||
|
|
||||||
|
level endon("game_ended");
|
||||||
|
player endon("death");
|
||||||
|
player endon("disconnect");
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
player.disguiseEntity waittill("damage", amount, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags);
|
||||||
|
attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback("standard");
|
||||||
|
// eInflictor = the entity that causes the damage (e.g. a claymore)
|
||||||
|
// eAttacker = the player that is attacking
|
||||||
|
// iDamage = the amount of damage to do
|
||||||
|
// sMeansOfDeath = string specifying the method of death (e.g. "MOD_PROJECTILE_SPLASH")
|
||||||
|
// sWeapon = string specifying the weapon used (e.g. "claymore_mp")
|
||||||
|
// damagepos = the position damage is coming from
|
||||||
|
// damagedir = the direction damage is moving in
|
||||||
|
player maps\mp\gametypes\_weapons::damageEnt(type, attacker, amount, "", modelName, point, direction_vec);
|
||||||
|
//player.health = player.disguiseEntity.health;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enables locking the angles of the disguise model using a player
|
* Enables locking the angles of the disguise model using a player
|
||||||
* command.
|
* command.
|
||||||
|
|
Loading…
Reference in New Issue