When the ceiling light moves, there's two spots where the light is. There is the light that is still shining on the ground, and the light at where ever the ceiling light is pointing at. How do I fix this?
Every time I compile my map I always spawn in spectator mode with the compass as if Im spectating in Multiplayer. I also get these random alien fonts too.
I've put down all of the Spawnpoints and script it right like this video tells me to.
i was trying to make a remake of rust from modern warfare 2. in the ugx script placer i chose the map source custom and my friend sent me the map files of the mw2 map. then i changed the .ff file into a .map file so it can work. then when i launched the radiant every thing worked except there was no map template please help
You weren't supposed to turn that .ff file into a .map file. That's like turning a .txt file into an .mp4 file and expecting it to work.
Adding that other gun does not cause the Colt error... I told you this a post back. All waw guns are called from dlc3.csv - if your getting a error it's a mistake in there
And I don't remember it being in the game at all - only remember the kar, scoped kar and ptrs - this no scope one doesn't exist
I suppose that I was trying to add a weapon in that wasn't supposed to be in. Case is solved?
dunno in my dlc3.csv it has "zombie_springfield" called but ofc i commented it straight back out, but none of those are "zombie_"
did it actually appear in zombies? I mean i know it was on one of the loadout lists but im not sure it ever actually appeared - might explain the missing weapon file
also if your zombie_colt error is "unknown item" - youve gone horribly wrong somewhere
Maybe not. Adding those into the .csv causes the zombie_colt error and the prefab (which doesn't have a scope?) gives the script runtime error. What is strange to me is that the model of the springfield in the prefab doesn't have a scope, yet the ones with _zombie after it has one.
Welp, maybe it's time to give up now. I can't find a copy of mod tools that has zombie_springfield. I think I can get by without adding one of the worst guns. Thanks for taking the time to help a Fresh Corpse.
I've noticed that there is no "zombie_springfield" in root\raw\weapons\sp. Could this be the source of the problem? After adding any of the other springfield files in that folder because there wasn't a zombie_springfield, I receive the error "Unknown item 'zombie_colt". Here is the console log.
//PI ESM - added for bouncing betties fx weapon/bouncing_betty/fx_explosion_betty_generic fx weapon/bouncing_betty/fx_betty_trail
//ESM - added for electrical trap fx misc/fx_zombie_electric_trap fx env/electrical/fx_elec_sparking_oneshot fx misc/fx_zombie_zapper_powerbox_on fx misc/fx_zombie_zapper_wall_control_on fx maps/zombie/fx_zombie_light_glow_green fx maps/zombie/fx_zombie_light_glow_red fx misc/fx_zombie_elec_trail_oneshot fx env/electrical/fx_elec_wire_spark_dl_oneshot fx env/electrical/fx_elec_player_md fx env/electrical/fx_elec_player_sm fx env/electrical/fx_elec_player_torso fx misc/fx_zombie_elec_gen_on fx misc/fx_zombie_elec_gen_idle xmodel zombie_zapper_cagelight_red xmodel zombie_zapper_cagelight_green
// PI ESM - added for PC running //xmodel exploding_barrel_test_d xmodel zombie_teddybear
// Scripted effects fx env/dirt/fx_dust_ceiling_impact_lg_mdbrown fx env/electrical/fx_elec_wire_spark_burst fx misc/fx_zombie_couch_effect fx destructibles/fx_dest_fire_vert fx bio/player/fx_footstep_dust fx bio/player/fx_footstep_water fx bio/player/fx_footstep_sand fx bio/player/fx_footstep_mud
fx weapon/bouncing_betty/fx_explosion_betty_generic fx weapon/bouncing_betty/fx_betty_trail
// Perks-a-cola effects fx misc/fx_zombie_cola_on fx misc/fx_zombie_cola_dtap_on fx misc/fx_zombie_cola_jugg_on fx misc/fx_zombie_cola_revive_on
// CreateFX effects fx env/fire/fx_embers_falling_sm
fx maps/mp_maps/fx_mp_ray_moon_lg_1sd fx maps/mp_maps/fx_mp_ray_fire_ribbon fx maps/mp_maps/fx_mp_ray_fire_ribbon_med fx maps/mp_maps/fx_mp_ray_moon_lg fx maps/mp_maps/fx_mp_ray_moon_md //fx maps/mp_maps/fx_mp_flare_med //fx maps/mp_maps/fx_mp_flare_md fx maps/mp_maps/fx_mp_ray_moon_sm //fx maps/mp_maps/fx_mp_ray_moon_xsm
fx maps/mp_maps/fx_mp_light_glow_indoor_short_loop fx maps/mp_maps/fx_mp_light_glow_outdoor_long_loop fx maps/mp_maps/fx_mp_insects_lantern fx maps/mp_maps/fx_mp_light_lamp fx maps/mp_maps/fx_mp_fire_torch_noglow fx maps/zombie/fx_zombie_moon_eclipse fx maps/zombie/fx_zombie_clock_hand fx maps/mp_maps/fx_mp_elec_broken_light_1shot fx "maps/mp_maps/fx_mp_light_lamp_no_eo "
fx maps/zombie/fx_zombie_packapunch
// CreateFX Exploders fx maps/zombie/fx_transporter_beam fx maps/zombie/fx_transporter_pad_start fx maps/zombie/fx_transporter_start fx maps/zombie/fx_transporter_ambient fx maps/zombie/fx_zombie_wire_spark fx maps/zombie/fx_zombie_mainframe_link_single fx maps/zombie/fx_zombie_mainframe_link_all fx maps/zombie/fx_zombie_mainframe_linked fx maps/zombie/fx_zombie_mainframe_beam fx maps/zombie/fx_zombie_mainframe_flat fx maps/zombie/fx_zombie_mainframe_flat_start fx maps/zombie/fx_zombie_mainframe_beam_start fx maps/zombie/fx_zombie_flashback_american fx maps/zombie/fx_zombie_difference fx maps/zombie/fx_zombie_mainframe_steam fx maps/zombie/fx_zombie_heat_sink fx maps/mp_maps/fx_mp_elec_spark_fast_random fx misc/fx_zombie_elec_gen_idle fx maps/zombie/fx_zombie_elec_pole_terminal
// Fog Sky and vision rawfile maps/createart/nazi_zombie_factory_art.gsc rawfile vision/zombie_factory.vision
// Pandora Box fx maps/zombie/fx_zombie_factory_marker fx maps/zombie/fx_zombie_factory_marker_fl fx maps/zombie/fx_zombie_factory_marker_sm
// dogs fx maps/zombie/fx_zombie_dog_eyes fx maps/zombie/fx_zombie_dog_explosion fx maps/zombie/fx_zombie_dog_fire_trail fx maps/zombie/fx_zombie_dog_ash_trail fx maps/zombie/fx_zombie_dog_breath
// Teleporter fx maps/zombie/fx_transporter_pad_start fx maps/zombie/fx_transporter_start fx maps/zombie/fx_transporter_beam
// Pause Screen Map material menu_map_nazi_zombie_factory
// Animtrees rawfile animtrees/zombie_factory.atr
// extra anims xanim o_zombie_lattice_gate_full xanim o_zombie_lattice_gate_half xanim o_zombie_difference_engine_ani
// Server Scripts rawfile maps/nazi_zombie_tunnel.gsc rawfile maps/createfx/nazi_zombie_tunnel_fx.gsc
// Fog Sky and Vision rawfile maps/createart/nazi_zombie_tunnel_art.gsc " // -- Keep This" But Can Change Values Inside File rawfile vision/zombie_factory.vision
////////////////////////////////////////////////////////////////// FX AREA /////////////////////////////////////////////////////////////////
// Scripted Effects fx env/dirt/fx_dust_ceiling_impact_lg_mdbrown fx env/electrical/fx_elec_wire_spark_burst fx misc/fx_zombie_couch_effect fx destructibles/fx_dest_fire_vert fx bio/player/fx_footstep_dust fx bio/player/fx_footstep_water fx bio/player/fx_footstep_sand fx bio/player/fx_footstep_mud fx env/weather/fx_snow_blizzard_intense
// CreateFX Effects fx maps/mp_maps/fx_mp_ray_moon_lg_1sd fx maps/mp_maps/fx_mp_ray_fire_ribbon fx maps/mp_maps/fx_mp_ray_fire_ribbon_med fx maps/mp_maps/fx_mp_ray_moon_lg fx maps/mp_maps/fx_mp_ray_moon_md fx maps/mp_maps/fx_mp_ray_moon_sm
fx maps/mp_maps/fx_mp_light_glow_indoor_short_loop fx maps/mp_maps/fx_mp_light_glow_outdoor_long_loop fx maps/mp_maps/fx_mp_insects_lantern fx maps/mp_maps/fx_mp_light_lamp fx maps/mp_maps/fx_mp_fire_torch_noglow fx maps/zombie/fx_zombie_moon_eclipse fx maps/zombie/fx_zombie_clock_hand fx maps/mp_maps/fx_mp_elec_broken_light_1shot fx maps/mp_maps/fx_mp_light_lamp_no_eo
My map patch .csv:
Code Snippet
Plaintext
// Materials material zombie_electric_shock_overlay material zombie_transporter_overlay
Its trying to get the hintstring of the weapon but it doesn't exist. My guess is that in the _zombiemode_weapons include_weapons function, the hint isn't being passed correctly.
Mind posting the contents of include_weapons in _zombiemode_weapons and what weapon your trying to add?
Here is the code. I've been trying to add in the springfield and I also think that the sawed double barrel gives that error too.
default_tesla_weighting_func() { num_to_add = 1; if( isDefined( level.pulls_since_last_tesla_gun ) ) { // player has dropped the tesla for another weapon, so we set all future polls to 20% if( isDefined(level.player_drops_tesla_gun) && level.player_drops_tesla_gun == true ) { num_to_add += int(.2 * level.zombie_include_weapons.size); }
// player has not seen tesla gun in late rounds if( !isDefined(level.player_seen_tesla_gun) || level.player_seen_tesla_gun == false ) { // after round 10 the Tesla gun percentage increases to 20% if( level.round_number > 10 ) { num_to_add += int(.2 * level.zombie_include_weapons.size); } // after round 5 the Tesla gun percentage increases to 15% else if( level.round_number > 5 ) { // calculate the number of times we have to add it to the array to get the desired percent num_to_add += int(.15 * level.zombie_include_weapons.size); } } } return num_to_add; }
default_ray_gun_weighting_func() { if( level.box_moved == true ) { num_to_add = 1; // increase the percentage of ray gun if( isDefined( level.pulls_since_last_ray_gun ) ) { // after 12 pulls the ray gun percentage increases to 15% if( level.pulls_since_last_ray_gun > 11 ) { num_to_add += int(level.zombie_include_weapons.size*0.15); } // after 8 pulls the Ray Gun percentage increases to 10% else if( level.pulls_since_last_ray_gun > 7 ) { num_to_add += int(.1 * level.zombie_include_weapons.size); } } return num_to_add; } else { return 0; } }
// // Slightly elevate the chance to get it until someone has it, then make it even default_cymbal_monkey_weighting_func() { players = get_players(); count = 0; for( i = 0; i < players.size; i++ ) { if( players[i] has_weapon_or_upgrade( "zombie_cymbal_monkey" ) ) { count++; } } if ( count > 0 ) { return 1; } else { if( level.round_number < 10 ) { return 3; } else { return 5; } } }
if(level.script != "nazi_zombie_prototype") { Precachemodel("zombie_teddybear"); } // ONLY 1 OF THE BELOW SHOULD BE ALLOWED add_limited_weapon( "m2_flamethrower_zombie", 1 ); add_limited_weapon( "tesla_gun", 1); }
//remove this function and whenever it's call for production. this is only for testing purpose. add_limited_tesla_gun() {
weapon_spawns[i] thread weapon_spawn_think(); model = getent( weapon_spawns[i].target, "targetname" ); model hide(); } }
// weapon cabinets which open on use init_weapon_cabinet() { // the triggers which are targeted at doors weapon_cabs = GetEntArray( "weapon_cabinet_use", "targetname" );
// returns the trigger hint string for the given weapon get_weapon_hint( weapon_name ) { AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );
return level.zombie_weapons[weapon_name].hint; }
get_weapon_cost( weapon_name ) { AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );
return level.zombie_weapons[weapon_name].cost; }
get_ammo_cost( weapon_name ) { AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );
get_is_in_box( weapon_name ) { AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );
if(level.script == "nazi_zombie_sumpf" || level.script == "nazi_zombie_factory" || level.script == "nazi_zombie_coast") { // Anchor target will grab the weapon spawn point inside the box, so the fx will be centered on it too anchor = GetEnt(level.chests[level.chest_index].target, "targetname"); anchorTarget = GetEnt(anchor.target, "targetname");
level.pandora_light = Spawn( "script_model", anchorTarget.origin ); level.pandora_light.angles = anchorTarget.angles + (-90, 0, 0); //temp_fx_origin rotateto((-90, (box_origin.angles[1] * -1), 0), 0.05); level.pandora_light SetModel( "tag_origin" ); playfxontag(level._effect["lght_marker"], level.pandora_light, "tag_origin"); } // DCS: we need a smaller light in the catacombs for paris, the generic one fills the area under the tower. else if(level.script == "nazi_zombie_paris") { // Anchor target will grab the weapon spawn point inside the box, so the fx will be centered on it too anchor = GetEnt(level.chests[level.chest_index].target, "targetname"); anchorTarget = GetEnt(anchor.target, "targetname");
//PI CHANGE - altered to allow for more than one piece of rubble rubble = getentarray( level.chests[index].script_noteworthy + "_rubble", "script_noteworthy" ); if ( IsDefined( rubble ) ) { for ( x = 0; x < rubble.size; x++ ) { rubble[x] hide(); } //END PI CHANGE } else { println( "^3Warning: No rubble found for magic box" ); } }
// PI_CHANGE_BEGIN - JMA - we want to play another effect on swamp anchor = GetEnt(self.target, "targetname"); anchorTarget = GetEnt(anchor.target, "targetname");
// waittill someuses uses this user = undefined; while( 1 ) { self waittill( "trigger", user );
if( user in_revive_trigger() ) { wait( 0.1 ); continue; }
// make sure the user is a player, and that they can afford it if( is_player_valid( user ) && user.score >= cost ) { user maps\_zombiemode_score::minus_to_player_score( cost ); break; } else if ( user.score < cost ) { user thread maps\_zombiemode_perks::play_no_money_perk_dialog(); continue; }
wait 0.05; }
// trigger_use->script_brushmodel lid->script_origin in radiant lid = getent( self.target, "targetname" ); weapon_spawn_org = getent( lid.target, "targetname" );
//open the lid lid thread treasure_chest_lid_open();
// SRS 9/3/2008: added to help other functions know if we timed out on grabbing the item self.timedOut = false;
// mario kart style weapon spawning weapon_spawn_org thread treasure_chest_weapon_spawn( self, user );
// the glowfx weapon_spawn_org thread treasure_chest_glowfx();
// take away usability until model is done randomizing self disable_trigger();
if (flag("moving_chest_now")) { user thread treasure_chest_move_vo(); self treasure_chest_move(lid);
} else { // Let the player grab the weapon and re-enable the box // self.grab_weapon_hint = true; self.chest_user = user; self sethintstring( &"ZOMBIE_TRADE_WEAPONS" ); self setCursorHint( "HINT_NOICON" ); self setvisibletoplayer( user );
// Limit its visibility to the player who bought the box self enable_trigger(); self thread treasure_chest_timeout();
// make sure the guy that spent the money gets the item // SRS 9/3/2008: ...or item goes back into the box if we time out while( 1 ) { self waittill( "trigger", grabber );
if( grabber == user || grabber == level ) {
if( grabber == user && is_player_valid( user ) && user GetCurrentWeapon() != "mine_bouncing_betty" ) { bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type magic_accept", user.playername, user.score, level.round_number, cost, weapon_spawn_org.weapon_string, self.origin ); self notify( "user_grabbed_weapon" ); user thread treasure_chest_give_weapon( weapon_spawn_org.weapon_string ); break; } else if( grabber == level ) { // it timed out self.timedOut = true; bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type magic_reject", user.playername, user.score, level.round_number, cost, weapon_spawn_org.weapon_string, self.origin ); break; } }
// // Disable trigger if can't buy weapon and also if someone else is using the chest decide_hide_show_chest_hint( endon_notify ) { if( isDefined( endon_notify ) ) { self endon( endon_notify ); }
while( true ) { players = get_players(); for( i = 0; i < players.size; i++ ) { // chest_user defined if someone bought a weapon spin, false when chest closed if ( (IsDefined(self.chest_user) && players[i] != self.chest_user ) || !players[i] can_buy_weapon() ) { self SetInvisibleToPlayer( players[i], true ); } else { self SetInvisibleToPlayer( players[i], false ); } } wait( 0.1 ); } }
//This keeps multiple voice overs from playing on the same player (both killstreaks and headshots). if (level.player_is_speaking != 1 && isDefined(sound)) { level.player_is_speaking = 1; self playsound(sound, "sound_done"); self waittill("sound_done"); level.player_is_speaking = 0; }
//TUEY - Play the 'disappear' sound playsoundatposition ("box_poof", soundpoint.origin); for(i=0;i<fake_pieces.size;i++) { fake_pieces[i] delete(); }
//gzheng-Show the rubble //PI CHANGE - allow for more than one object of rubble per box rubble = getentarray(self.script_noteworthy + "_rubble", "script_noteworthy");
if ( IsDefined( rubble ) ) { for (i = 0; i < rubble.size; i++) { rubble[i] show(); } } else { println( "^3Warning: No rubble found for magic box" ); }
wait(0.1); anchor delete(); soundpoint delete();
old_chest_index = level.chest_index;
wait(5);
//chest moving logic //PI CHANGE - for sumpf, this doesn't work because chest_index is always incremented twice (here and line 724) - while this would work with an odd number of chests, // with an even number it skips half of the chest locations in the map
level.verify_chest = false; //wait(3); //make sure level is asylum, factory, or sumpf and make magic box only appear in location player have open, it's off by default //also make sure box doesn't respawn in old location. //PI WJB: removed check on "magic_box_explore_only" dvar because it is only ever used here and when it is set in _zombiemode.gsc line 446 // where it is declared and set to 0, causing this while loop to never happen because the check was to see if it was equal to 1 if( level.script == "nazi_zombie_asylum" || level.script == "nazi_zombie_factory" || level.script == "nazi_zombie_sumpf" || level.script == "nazi_zombie_paris" || level.script == "nazi_zombie_coast" || level.script == "nazi_zombie_theater" || level.script == "nazi_zombie_tunnel") { level.chest_index++;
if (level.chest_index >= level.chests.size) { //PI CHANGE - this way the chests won't move in the same order the second time around temp_chest_name = level.chests[level.chest_index - 1].script_noteworthy; level.chest_index = 0; level.chests = array_randomize(level.chests); //in case it happens to randomize in such a way that the chest_index now points to the same location // JMA - want to avoid an infinite loop, so we use an if statement if (temp_chest_name == level.chests[level.chest_index].script_noteworthy) { level.chest_index++; } //END PI CHANGE }
//turn off magic box light. level notify("magic_box_light_switch"); //PI CHANGE - altered to allow for more than one object of rubble per box unhide_magic_box( level.chest_index );
} //verify if that magic box is open to players or not. verify_chest_is_open() {
//for(i = 0; i < 5; i++) //PI CHANGE - altered so that there can be more than 5 valid chest locations for (i = 0; i < level.open_chest_location.size; i++) { if(isdefined(level.open_chest_location[i])) { if(level.open_chest_location[i] == level.chests[level.chest_index].script_noteworthy) { level.verify_chest = true; return; } }
// Check the pack a punch machines to see if they are holding what we're looking for for ( k=0; k<pap_triggers.size; k++ ) { if ( IsDefined(pap_triggers[k].current_weapon) && pap_triggers[k].current_weapon == keys2[q] ) { count++; } }
// Check the pack a punch machines to see if they are holding what we're looking for for ( k=0; k<pap_triggers.size; k++ ) { if ( IsDefined(pap_triggers[k].current_weapon) && pap_triggers[k].current_weapon == keys2[q] ) { count++; } }
//increase the chance of joker appearing from 0-100 based on amount of the time chest has been opened. if(level.script != "nazi_zombie_prototype" && getdvar("magic_chest_movable") == "1") {
if(level.chest_accessed < level.chest_min_move_usage) { // PI_CHANGE_BEGIN - JMA - RandomInt(100) can return a number between 0-99. If it's zero and chance_of_joker is zero // we can possibly have a teddy bear one after another. chance_of_joker = -1; // PI_CHANGE_END } else { chance_of_joker = level.chest_accessed + 20;
// make sure teddy bear appears on the 8th pull if it hasn't moved from the initial spot if( (!isDefined(level.magic_box_first_move) || level.magic_box_first_move == false ) && level.chest_accessed >= 8) { chance_of_joker = 100; }
// pulls 4 thru 8, there is a 15% chance of getting the teddy bear // NOTE: this happens in all cases if( level.chest_accessed >= 4 && level.chest_accessed < 8 ) { if( random < 15 ) { chance_of_joker = 100; } else { chance_of_joker = -1; } }
// after the first magic box move the teddy bear percentages changes if( isDefined(level.magic_box_first_move) && level.magic_box_first_move == true ) { // between pulls 8 thru 12, the teddy bear percent is 30% if( level.chest_accessed >= 8 && level.chest_accessed < 13 ) { if( random < 30 ) { chance_of_joker = 100; } else { chance_of_joker = -1; } }
// after 12th pull, the teddy bear percent is 50% if( level.chest_accessed >= 13 ) { if( random < 50 ) { chance_of_joker = 100; } else { chance_of_joker = -1; } } } }
if (random <= chance_of_joker) { model SetModel("zombie_teddybear"); // model rotateto(level.chests[level.chest_index].angles, 0.01); //wait(1); model.angles = self.angles; wait 1; flag_set("moving_chest_now"); self notify( "move_imminent" ); level.chest_accessed = 0;
player maps\_zombiemode_score::add_to_player_score( 950 );
//allow power weapon to be accessed. level.box_moved = true; } }
self notify( "randomization_done" );
if (flag("moving_chest_now")) { wait .5; // we need a wait here before this notify level notify("weapon_fly_away_start"); wait 2; model MoveZ(500, 4, 3); model waittill("movedone"); model delete(); self notify( "box_moving" ); level notify("weapon_fly_away_end"); } else {
//turn off power weapon, since player just got one if( rand == "tesla_gun" || rand == "ray_gun" ) { // PI_CHANGE_BEGIN - JMA - reset the counters for tesla gun and ray gun pulls if( isDefined( level.script ) && (level.script == "nazi_zombie_sumpf" || level.script == "nazi_zombie_factory") ) { if( rand == "ray_gun" ) { level.box_moved = false; level.pulls_since_last_ray_gun = 0; }
model thread timer_til_despawn(floatHeight); self waittill( "weapon_grabbed" );
if( !chest.timedOut ) { model Delete(); }
} } timer_til_despawn(floatHeight) {
// SRS 9/3/2008: if we timed out, move the weapon back into the box instead of deleting it putBackTime = 12; self MoveTo( self.origin - ( 0, 0, floatHeight ), putBackTime, ( putBackTime * 0.5 ) ); wait( putBackTime );
// self is the player string comes from the randomization function treasure_chest_give_weapon( weapon_string ) { primaryWeapons = self GetWeaponsListPrimaries(); current_weapon = undefined;
// This should never be true for the first time. if( primaryWeapons.size >= 2 ) // he has two weapons { current_weapon = self getCurrentWeapon(); // get hiss current weapon
if( weapon_string == "molotov" || weapon_string == "molotov_zombie" ) { // PI_CHANGE_BEGIN // JMA 051409 sanity check to see if we have the weapon before we remove it has_weapon = self HasWeapon( "zombie_cymbal_monkey" ); if( isDefined(has_weapon) && has_weapon ) { self TakeWeapon( "zombie_cymbal_monkey" ); } // PI_CHANGE_END } if( weapon_string == "zombie_cymbal_monkey" ) { // PI_CHANGE_BEGIN // JMA 051409 sanity check to see if we have the weapon before we remove it has_weapon = self HasWeapon( "molotov" ); if( isDefined(has_weapon) && has_weapon ) { self TakeWeapon( "molotov" ); }