Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef __DISGUISE__
- #define __DISGUISE__
- object playertools_disguise : player_tools {
- void init();
- void update(entity userEntity);
- void disguise(entity userEntity);
- void undisguise(entity userEntity);
- void setdefault(entity userEntity);
- void inventoryUse(entity userEntity, entity frobbedEntity, float buttonState);
- float _overlayHandle;
- float _updateThread;
- string player_head_model;
- string player_head_skin;
- float player_team;
- float player_rank;
- float player_gender;
- float player_type;
- boolean active;
- float strength;
- };
- void playertools_disguise::init() {}
- void playertools_disguise::update(entity userEntity)
- {
- eachFrame
- {
- // Add the fixed regeneration rate of the disguise, frametime corrected
- strength = strength + getFloatKey("regen") * sys.getFrameTime();
- entity ent;
- do
- {
- // Loop through all AI related to the team who are within valid distance of the wearer, effects stack up with more affected guards
- // The disguise wears out with distance, multiplied by the visual rate of AI visual acuity, multiplied by alert rate of AI alert level
- // To check if the player is being seen by the AI, use findFriendlyAI when disguised (same team) or findEnemyAI if not disguised (different team)
- ent = sys.getNextEntity("AIUse", "AIUSE_PERSON", ent);
- if(ent != $null_entity && ent.getAcuity("vis") > 0 && sys.getRelation(ent.getTeam(), getFloatKey("team")) > 0)
- {
- ai ent_ai = ent;
- float dist = 1 - ent_ai.distanceTo(userEntity) / (ent_ai.getAcuity("vis") * getFloatKey("distance"));
- if(dist > 0 && ((active && ent_ai.findFriendlyAI(getFloatKey("team")) == userEntity) || (!active && ent_ai.findEnemyAI(true) == userEntity)))
- strength = strength - dist * getFloatKey("rate") * (1 + ent_ai.AI_AlertLevel * getFloatKey("rate_alert")) * sys.getFrameTime();
- }
- }
- while(ent != $null_entity);
- if(strength <= 0)
- {
- strength = 0;
- undisguise(userEntity);
- }
- else if(strength >= 1)
- {
- strength = 1;
- disguise(userEntity);
- }
- userEntity.setGuiFloat(_overlayHandle, "DisguiseStrength", strength);
- }
- }
- void playertools_disguise::disguise(entity userEntity)
- {
- // Activate the disguise
- if(active)
- return;
- active = true;
- // Changing the head is currently disabled due to bug #6326, https://bugs.thedarkmod.com/view.php?id=6326
- //entity head = userEntity.getHead();
- //head.setModel(getKey("model_head"));
- //head.setSkin(getKey("skin_head"));
- userEntity.setTeam(getFloatKey("team"));
- userEntity.setKey("rank", getFloatKey("rank"));
- userEntity.setKey("personGender", getFloatKey("personGender"));
- userEntity.setKey("personType", getFloatKey("personType"));
- userEntity.setGuiInt(_overlayHandle, "DisguiseActive", 1);
- }
- void playertools_disguise::undisguise(entity userEntity)
- {
- // Deactivate the disguise
- if(!active)
- return;
- active = false;
- // Changing the head is currently disabled due to bug #6326, https://bugs.thedarkmod.com/view.php?id=6326
- //entity head = userEntity.getHead();
- //head.setModel(player_head_model);
- //head.setSkin(player_head_skin);
- userEntity.setTeam(player_team);
- userEntity.setKey("rank", player_rank);
- userEntity.setKey("personGender", player_gender);
- userEntity.setKey("personType", player_type);
- userEntity.setGuiInt(_overlayHandle, "DisguiseActive", 0);
- }
- void playertools_disguise::setdefault(entity userEntity)
- {
- // Remember the default player properties
- entity head = userEntity.getHead();
- player_head_model = head.getKey("model");
- player_head_skin = head.getKey("skin");
- player_team = userEntity.getTeam();
- player_rank = userEntity.getFloatKey("rank");
- player_gender = userEntity.getFloatKey("personGender");
- player_type = userEntity.getFloatKey("personType");
- }
- void playertools_disguise::inventoryUse(entity userEntity, entity frobbedEntity, float buttonState)
- {
- // To prevent allowing multiple disguises simultaneously, only wear if no disguise is set and remove if matching disguise is set
- if(userEntity.getKey("disguise") == "")
- {
- // Wear the item
- strength = 0;
- setdefault(userEntity);
- _updateThread = thread update(userEntity);
- _overlayHandle = userEntity.createOverlay(getKey("gui"), 0);
- userEntity.setGuiString(_overlayHandle, "DisguiseOverlay", getKey("overlay"));
- userEntity.setGuiString(_overlayHandle, "DisguiseIcon", getKey("inv_icon"));
- userEntity.setGuiString(_overlayHandle, "DisguiseText", getKey("inv_name"));
- userEntity.setHinderance("disguise", getFloatKey("speed_move"), 1);
- userEntity.setTurnHinderance("disguise", getFloatKey("speed_turn"), 1);
- userEntity.startSoundShader(getKey("snd_wear"), SND_CHANNEL_ANY);
- userEntity.setKey("disguise", getKey("inv_name"));
- sys.fadeIn('0 0 0', 0.5);
- }
- else if(userEntity.getKey("disguise") == getKey("inv_name"))
- {
- // Take off the item
- sys.terminate(_updateThread);
- userEntity.destroyOverlay(_overlayHandle);
- userEntity.setHinderance("disguise", 1, 1);
- userEntity.setTurnHinderance("disguise", 1, 1);
- userEntity.startSoundShader(getKey("snd_remove"), SND_CHANNEL_ANY);
- userEntity.setKey("disguise", "");
- sys.fadeIn('0 0 0', 0.5);
- undisguise(userEntity);
- }
- }
- #endif //__DISGUISE__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement