ztavern/t6/uncompiled mods/_zm_weapon_locker.gsc
2024-10-18 00:19:19 +00:00

530 lines
13 KiB
Text

#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
saveLockerWeapon() {
level endon("eng_game");
self endon("disconnect");
for (;;) {
if (self.changedWeaponData) {
self.changedWeaponData = false;
self logWeaponData();
}
wait 5;
}
}
logWeaponData() {
lockerEvent = [];
lockerEvent["event"] = "locker_set";
lockerEvent["player"] = [];
lockerEvent["player"]["Guid"] = self.guid;
lockerEvent["weapondata"] = self._weapondata;
logPrint(json_encode(lockerEvent));
}
main()
{
if (getDvar("g_gametype") != "zclassic") {
return;
}
if (getDvar("mapname") != "zm_buried" && getDvar("mapname") != "zm_highrise" && getDvar("mapname") != "zm_transit") {
return;
}
if ( !isDefined( level.weapon_locker_map ) )
{
level.weapon_locker_map = level.script;
}
weapon_lockers = getstructarray( "weapons_locker", "targetname" );
array_thread( weapon_lockers, ::triggerweaponslockerwatch );
}
updateLockerWeapon() {
level endon("end_game");
self endon("disconnect");
for (;;) {
if (getDvar(self getGuid() + "_update") != "") {
dvar = getDvar(self getGuid() + "_update");
setDvar(self getGuid() + "_update", "");
self._weapondata = parseWeaponData(dvar);
self thread triggerweaponslockerweaponchangethink();
}
wait 0.5;
}
}
wl_has_stored_weapondata()
{
if (!isDefined(self.gotweapondata)) {
self wl_get_stored_weapondata();
self.changedWeaponData = false;
self thread updateLockerWeapon();
self thread saveLockerWeapon();
self.gotweapondata = true;
}
return isDefined(self._weapondata);
}
parseWeaponData(string) {
weaponraw = strTok(string, ",");
if (weaponraw.size < 11) {
return undefined;
}
weapondata = [];
weapondata["alt_stock"] = weaponraw[0];
weapondata["alt_clip"] = weaponraw[1];
weapondata["lh_clip"] = weaponraw[2];
weapondata["overheat"] = weaponraw[3];
weapondata["heat"] = weaponraw[4];
weapondata["fuel"] = weaponraw[5];
weapondata["stock"] = weaponraw[6];
weapondata["clip"] = weaponraw[7];
weapondata["alt_name"] = weaponraw[8];
weapondata["dw_name"] = weaponraw[9];
weapondata["name"] = weaponraw[10];
return weapondata;
}
wl_get_stored_weapondata()
{
if (isDefined(self.gotdvar) || isDefined(self._weapondata)) {
return self._weapondata;
}
dvarValue = getDvar(self getGuid() + "_weapondata");
self.gotdvar = true;
if (strTok(dvarValue, ",").size < 11) {
self._weapondata = undefined;
return self._weapondata;
}
self._weapondata = parseWeaponData(dvarValue);
return self._weapondata;
}
wl_clear_stored_weapondata()
{
self._weapondata = undefined;
self.canuselocker = false;
self logWeaponData();
self thread resetLockerUse();
}
resetLockerUse() {
wait 3;
self.canuselocker = true;
}
wl_set_stored_weapondata( weapondata )
{
self._weapondata = weapondata;
self.canuselocker = false;
self logWeaponData();
self thread resetLockerUse();
}
triggerweaponslockerwatch()
{
unitrigger_stub = spawnstruct();
unitrigger_stub.origin = self.origin;
if ( isDefined( self.script_angles ) )
{
unitrigger_stub.angles = self.script_angles;
}
else
{
unitrigger_stub.angles = self.angles;
}
unitrigger_stub.script_angles = unitrigger_stub.angles;
if ( isDefined( self.script_length ) )
{
unitrigger_stub.script_length = self.script_length;
}
else
{
unitrigger_stub.script_length = 16;
}
if ( isDefined( self.script_width ) )
{
unitrigger_stub.script_width = self.script_width;
}
else
{
unitrigger_stub.script_width = 32;
}
if ( isDefined( self.script_height ) )
{
unitrigger_stub.script_height = self.script_height;
}
else
{
unitrigger_stub.script_height = 64;
}
unitrigger_stub.origin -= anglesToRight( unitrigger_stub.angles ) * ( unitrigger_stub.script_length / 2 );
unitrigger_stub.targetname = "weapon_locker";
unitrigger_stub.cursor_hint = "HINT_NOICON";
unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
unitrigger_stub.clientfieldname = "weapon_locker";
maps/mp/zombies/_zm_unitrigger::unitrigger_force_per_player_triggers( unitrigger_stub, 1 );
unitrigger_stub.prompt_and_visibility_func = ::triggerweaponslockerthinkupdateprompt;
maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( unitrigger_stub, ::triggerweaponslockerthink );
}
is_weapon_included( weapon_name ) //checked matches cerberus output
{
if ( !isDefined( level.zombie_weapons ) )
{
return 0;
}
return isDefined( level.zombie_weapons[ weapon_name ] );
}
get_nonalternate_weapon( altweapon ) //checked changed to match cerberus output
{
if ( is_alt_weapon( altweapon ) )
{
alt = weaponaltweaponname( altweapon );
if ( alt == "none" )
{
primaryweapons = self getweaponslistprimaries();
alt = primaryweapons[ 0 ];
foreach ( weapon in primaryweapons )
{
if ( weaponaltweaponname( weapon ) == altweapon )
{
alt = weapon;
break;
}
}
}
return alt;
}
return altweapon;
}
triggerweaponslockerisvalidweaponpromptupdate( player, weaponname )
{
if (isDefined(player.canuselocker) && !player.canuselocker) {
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
return;
}
retrievingweapon = player wl_has_stored_weapondata();
if ( !retrievingweapon )
{
weaponname = player get_nonalternate_weapon( weaponname );
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
}
else
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_STORE" );
}
}
else
{
weapondata = player wl_get_stored_weapondata();
if ( isDefined( level.remap_weapon_locker_weapons ) )
{
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
}
weapontogive = weapondata[ "name" ];
primaries = player getweaponslistprimaries();
maxweapons = get_player_weapon_limit( player );
weaponname = player get_nonalternate_weapon( weaponname );
if (isDefined( primaries ) && primaries.size >= maxweapons)
{
if ( !triggerweaponslockerisvalidweapon( weaponname ) )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
return;
}
}
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_GRAB" );
}
}
triggerweaponslockerthinkupdateprompt( player )
{
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
return 1;
}
arr2json(arr) {
if (isObj(arr)) {
return obj2json(arr);
}
keys = getArrayKeys(arr);
string = "[";
for (i = 0; i < keys.size; i++) {
key = keys[i];
if (!isObj(arr[key])) {
if (isInt(arr[key])) {
string += arr[key];
} else {
string += "\"" + arr[key] + "\"";
}
} else {
string += obj2json(arr[key]);
}
if (i < keys.size - 1) {
string += ", ";
}
}
string += "]";
return string;
}
isInt(var) {
return int(var) == var;
}
json_encode(obj) {
if (!IsArray(obj)) {
return "\"" + obj + "\"\n";
}
if (!isObj(obj)) {
return arr2json(obj) + "\n";
}
return obj2json(obj) + "\n";
}
obj2json(obj) {
string = "{";
keys = getArrayKeys(obj);
if (!isDefined(keys)) {
return "{ struct }";
}
for (i = 0; i < keys.size; i++) {
key = keys[i];
if (IsArray(obj[key])) {
string += "\"" + key + "\": " + arr2json(obj[key]);
} else {
if (!isInt(obj[key])) {
string += "\"" + key + "\": \"" + obj[key] + "\"";
} else {
string += "\"" + key + "\": " + obj[key];
}
}
if (i < keys.size - 1) {
string += ", ";
}
}
string += "}";
return string;
}
isObj(obj) {
keys = getArrayKeys(obj);
if (!isDefined(keys)) {
return false;
}
for (i = 0; i < keys.size; i++) {
if (int(keys[i]) == 0 && keys[i] != 0) {
return true;
}
}
return false;
}
triggerweaponslockerisvalidweapon( weaponname )
{
weaponname = get_base_weapon_name( weaponname, 1 );
if ( !is_weapon_included( weaponname ) )
{
return 0;
}
if ( is_offhand_weapon( weaponname ) || is_limited_weapon( weaponname ) )
{
return 0;
}
return 1;
}
triggerweaponslockerthink()
{
self.parent_player thread triggerweaponslockerweaponchangethink( self );
while ( 1 )
{
self waittill( "trigger", player );
if (!isDefined(player.canuselocker)) {
player.canuselocker = true;
}
if (!player.canuselocker) {
continue;
}
retrievingweapon = player wl_has_stored_weapondata();
if ( !retrievingweapon )
{
curweapon = player getcurrentweapon();
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
if ( !triggerweaponslockerisvalidweapon( curweapon ) )
{
continue;
}
weapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
player wl_set_stored_weapondata( weapondata );
player takeweapon( curweapon );
primaries = player getweaponslistprimaries();
if ( isDefined( primaries[ 0 ] ) )
{
player switchtoweapon( primaries[ 0 ] );
}
else
{
player maps/mp/zombies/_zm_weapons::give_fallback_weapon();
}
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
player playsoundtoplayer( "evt_fridge_locker_close", player );
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "weapon_storage" );
}
else
{
curweapon = player getcurrentweapon();
primaries = player getweaponslistprimaries();
weapondata = player wl_get_stored_weapondata();
if ( isDefined( level.remap_weapon_locker_weapons ) )
{
weapondata = remap_weapon( weapondata, level.remap_weapon_locker_weapons );
}
weapontogive = weapondata[ "name" ];
while ( !triggerweaponslockerisvalidweapon( weapontogive ) )
{
player playlocalsound( level.zmb_laugh_alias );
player wl_clear_stored_weapondata();
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
}
curweap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( curweapon, 1 );
weap_base = maps/mp/zombies/_zm_weapons::get_base_weapon_name( weapontogive, 1 );
while ( player has_weapon_or_upgrade( weap_base ) && weap_base != curweap_base )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
wait 3;
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
}
maxweapons = get_player_weapon_limit( player );
if (isDefined(primaries) && primaries.size >= maxweapons)
{
curweapon = player maps/mp/zombies/_zm_weapons::switch_from_alt_weapon( curweapon );
while ( !triggerweaponslockerisvalidweapon( curweapon ) )
{
self sethintstring( &"ZOMBIE_WEAPON_LOCKER_DENY" );
wait 3;
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
}
curweapondata = player maps/mp/zombies/_zm_weapons::get_player_weapondata( player );
player takeweapon( curweapondata[ "name" ] );
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
player wl_set_stored_weapondata( curweapondata );
player switchtoweapon( weapondata[ "name" ] );
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
}
else
{
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "wall_withdrawl" );
player wl_clear_stored_weapondata();
player maps/mp/zombies/_zm_weapons::weapondata_give( weapondata );
player switchtoweapon( weapondata[ "name" ] );
self triggerweaponslockerisvalidweaponpromptupdate( player, player getcurrentweapon() );
}
level notify( "weapon_locker_grab" );
player playsoundtoplayer( "evt_fridge_locker_open", player );
}
wait 0.5;
}
}
triggerweaponslockerweaponchangethink( trigger )
{
self endon( "disconnect" );
self endon( "death" );
trigger endon( "kill_trigger" );
while ( 1 )
{
self waittill( "weapon_change", newweapon );
trigger triggerweaponslockerisvalidweaponpromptupdate( self, newweapon );
}
}
add_weapon_locker_mapping( fromweapon, toweapon )
{
if ( !isDefined( level.remap_weapon_locker_weapons ) )
{
level.remap_weapon_locker_weapons = [];
}
level.remap_weapon_locker_weapons[ fromweapon ] = toweapon;
}
remap_weapon( weapondata, maptable )
{
name = get_base_name( weapondata[ "name" ] );
att = get_attachment_name( weapondata[ "name" ] );
if ( isDefined( maptable[ name ] ) )
{
weapondata[ "name" ] = maptable[ name ];
name = weapondata[ "name" ];
if ( is_weapon_upgraded( name ) )
{
if ( isDefined( att ) && weapon_supports_attachments( name ) )
{
base = get_base_weapon_name( name, 1 );
if ( !weapon_supports_this_attachment( base, att ) )
{
att = random_attachment( base );
}
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
}
else
{
if ( weapon_supports_default_attachment( name ) )
{
att = default_attachment( name );
weapondata[ "name" ] = weapondata[ "name" ] + "+" + att;
}
}
}
}
else
{
return weapondata;
}
name = weapondata[ "name" ];
dw_name = weapondualwieldweaponname( name );
alt_name = weaponaltweaponname( name );
if ( name != "none" )
{
weapondata[ "clip" ] = int( min( weapondata[ "clip" ], weaponclipsize( name ) ) );
weapondata[ "stock" ] = int( min( weapondata[ "stock" ], weaponmaxammo( name ) ) );
}
if ( dw_name != "none" )
{
weapondata[ "lh_clip" ] = int( min( weapondata[ "lh_clip" ], weaponclipsize( dw_name ) ) );
}
if ( alt_name != "none" )
{
weapondata[ "alt_clip" ] = int( min( weapondata[ "alt_clip" ], weaponclipsize( alt_name ) ) );
weapondata[ "alt_stock" ] = int( min( weapondata[ "alt_stock" ], weaponmaxammo( alt_name ) ) );
}
weapondata[ "dw_name" ] = dw_name;
weapondata[ "alt_name" ] = alt_name;
return weapondata;
}