mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-06-05 05:24:36 +01:00
84dc5535dc
* These two are easy * !!!runlevel_flags the fact it was global.runlevel_flags.len has me a bit...iffy on this. * !!!json_cache Same as above. used global. * player_list & observer_mob_list * mechas_list * this wasn't even used * surgery_steps * event_triggers * landmarks_list * dead_mob_list * living_mob_list * ai_list * cable_list * cleanbot_reserved_turfs * listening_objects * silicon_mob_list * human_mob_list * Update global_lists.dm * joblist * mob_list * Update global_lists.dm * holomap_markers * mapping_units * mapping_beacons * hair_styles_list * facial_hair_styles_list * Update global_lists.dm * facial_hair_styles_male_list * facial_hair_styles_female_list * body_marking_styles_list * body_marking_nopersist_list * ear_styles_list * hair_styles_male_list * tail_styles_list * wing_styles_list * escape_list & rune_list & endgame_exits these were all really small * endgame_safespawns * stool_cache * emotes_by_key * random_maps & map_count * item_tf_spawnpoints * narsie_list * active_radio_jammers * unused * paikeys * pai_software_by_key & default_pai_software * plant_seed_sprites * magazine_icondata_keys & magazine_icondata_states * unused * ashtray_cache * light_type_cache * HOLIDAY!!! this one was annoying * faction stuff (red?!) * Update preferences_factions.dm * vs edit removal * backbaglist, pdachoicelist, exclude_jobs * item_digestion_blacklist, edible_tech, blacklisted_artifact_effect, selectable_footstep, hexNums, syndicate_access * string_slot_flags and hexdigits->hexNums * possible_changeling_IDs * vr_mob_tf_options * vr_mob_spawner_options * pipe_colors * vr_mob_spawner_options * common_tools * newscaster_standard_feeds * Update periodic_news.dm * changeling_fabricated_clothing * semirandom_mob_spawner_decisions * id_card_states * Update syndicate_ids.dm * overlay_cache & gear_distributed_to * more * radio_channels_by_freq * Update global_lists.dm * proper * default_medbay_channels & default_internal_channels default_internal_channels is weird as it has a mapbased proc() but that proc is never called... * valid_ringtones * move this * possible_plants * more * separate these moves xeno2chemlist from a hook to a new global list. * tube_dir_list * valid_bloodreagents & monitor_states * Junk * valid_bloodtypes * breach_burn_descriptors & burn * more!! appliance_available_recipes seems uber cursed, re-look at later * Appliance code is cursed * wide_chassis & flying_chassis * allows_eye_color * all_tooltip_styles * direction_table * gun_choices * severity_to_string * old event_viruses * description_icons * MOVE_KEY_MAPPINGS * more more * pai & robot modules * Update global_lists.dm * GEOSAMPLES Also swaps a .len to LAZYLEN() * shieldgens * reagent recipies * global ammo types * rad collector * old file and unused global * nif_look_messages * FESH * nifsoft * chamelion * the death of sortAtom * globulins * lazylen that * Update global_lists.dm * LAZY * Theese too * quick fix --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
199 lines
5.1 KiB
Plaintext
199 lines
5.1 KiB
Plaintext
/obj/structure/mob_spawner
|
|
name = "mob spawner"
|
|
desc = "This shouldn't be seen, yell at a dev."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "rift"
|
|
anchored = TRUE
|
|
|
|
var/last_spawn = 0
|
|
var/spawn_delay = 10 MINUTES
|
|
|
|
var/list/spawn_types = list(
|
|
/mob/living/simple_mob/animal/passive/dog/corgi = 100,
|
|
/mob/living/simple_mob/animal/passive/cat = 25
|
|
)
|
|
|
|
var/total_spawns = -1 //Total mob spawns, over all time, -1 for no limit
|
|
var/simultaneous_spawns = 3 //Max spawned mobs active at one time
|
|
var/mob_faction
|
|
|
|
var/destructible = 0
|
|
var/health = 50
|
|
|
|
var/list/spawned_mobs = list()
|
|
|
|
/obj/structure/mob_spawner/Initialize(mapload)
|
|
. = ..()
|
|
START_PROCESSING(SSobj, src)
|
|
last_spawn = world.time + rand(0,spawn_delay)
|
|
|
|
/obj/structure/mob_spawner/Destroy()
|
|
STOP_PROCESSING(SSobj, src)
|
|
for(var/mob/living/L in spawned_mobs)
|
|
L.nest = null
|
|
spawned_mobs.Cut()
|
|
return ..()
|
|
|
|
/obj/structure/mob_spawner/process()
|
|
if(!can_spawn())
|
|
return
|
|
var/chosen_mob = choose_spawn()
|
|
if(chosen_mob)
|
|
do_spawn(chosen_mob)
|
|
|
|
/obj/structure/mob_spawner/proc/can_spawn()
|
|
if(!total_spawns)
|
|
return 0
|
|
if(spawned_mobs.len >= simultaneous_spawns)
|
|
return 0
|
|
if(world.time < last_spawn + spawn_delay)
|
|
return 0
|
|
return 1
|
|
|
|
/obj/structure/mob_spawner/proc/choose_spawn()
|
|
return pickweight(spawn_types)
|
|
|
|
/obj/structure/mob_spawner/proc/do_spawn(var/mob_path)
|
|
if(!ispath(mob_path))
|
|
return 0
|
|
var/mob/living/L = new mob_path(get_turf(src))
|
|
L.nest = src
|
|
spawned_mobs.Add(L)
|
|
last_spawn = world.time
|
|
if(total_spawns > 0)
|
|
total_spawns--
|
|
if(mob_faction)
|
|
L.faction = mob_faction
|
|
return L
|
|
|
|
/obj/structure/mob_spawner/proc/get_death_report(var/mob/living/L)
|
|
if(L in spawned_mobs)
|
|
spawned_mobs.Remove(L)
|
|
|
|
/obj/structure/mob_spawner/attackby(var/obj/item/I, var/mob/living/user)
|
|
if(!I.force || I.flags & NOBLUDGEON || !destructible)
|
|
return
|
|
|
|
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
user.do_attack_animation(src)
|
|
visible_message(span_warning("\The [src] has been [LAZYLEN(I.attack_verb) ? "[pick(I.attack_verb)]":"attacked"] with \the [I] by [user]."))
|
|
take_damage(I.force)
|
|
|
|
/obj/structure/mob_spawner/bullet_act(var/obj/item/projectile/Proj)
|
|
..()
|
|
if(destructible)
|
|
take_damage(Proj.get_structure_damage())
|
|
|
|
/obj/structure/mob_spawner/take_damage(var/damage)
|
|
health -= damage
|
|
if(health <= 0)
|
|
visible_message(span_warning("\The [src] breaks apart!"))
|
|
qdel(src)
|
|
|
|
/obj/structure/mob_spawner/clear_zlevel/can_spawn()
|
|
if(!..())
|
|
return 0
|
|
var/turf/T = get_turf(src)
|
|
if(!T)
|
|
return 0
|
|
for(var/mob/living/L in GLOB.player_list)
|
|
var/turf/L_T
|
|
if(L.stat == DEAD)
|
|
continue
|
|
L_T = get_turf(L)
|
|
if(T.z == L_T.z)
|
|
return 0
|
|
return 1
|
|
|
|
|
|
/*
|
|
This code is based on the mob spawner and the proximity sensor, the idea is to lazy load mobs to avoid having the server use mobs when they arent needed.
|
|
It also makes it so a ghost wont know where all the goodies/mobs are.
|
|
*/
|
|
|
|
/obj/structure/mob_spawner/scanner
|
|
name ="Lazy Mob Spawner"
|
|
var/range = 10 //range in tiles from the spawner to detect moving stuff
|
|
|
|
/obj/structure/mob_spawner/scanner/process()
|
|
if(!can_spawn())
|
|
return
|
|
if(world.time > last_spawn + spawn_delay)
|
|
var/turf/mainloc = get_turf(src)
|
|
for(var/mob/living/A in range(range,mainloc))
|
|
if ((A.faction != mob_faction) && (A.move_speed < 12))
|
|
var/chosen_mob = choose_spawn()
|
|
if(chosen_mob)
|
|
do_spawn(chosen_mob)
|
|
|
|
//////////////
|
|
// Spawners //
|
|
/////////////
|
|
/obj/structure/mob_spawner/scanner/corgi
|
|
name = "Corgi Lazy Spawner"
|
|
desc = "This is a proof of concept, not sure why you would use this one"
|
|
spawn_delay = 3 MINUTES
|
|
mob_faction = FACTION_CORGI
|
|
spawn_types = list(
|
|
/mob/living/simple_mob/animal/passive/dog/corgi = 75,
|
|
/mob/living/simple_mob/animal/passive/dog/corgi/puppy = 50
|
|
)
|
|
|
|
simultaneous_spawns = 5
|
|
range = 7
|
|
destructible = 1
|
|
health = 200
|
|
total_spawns = 100
|
|
|
|
/obj/structure/mob_spawner/scanner/wild_animals
|
|
name = "Wilderness Lazy Spawner"
|
|
spawn_delay = 10 MINUTES
|
|
range = 10
|
|
simultaneous_spawns = 1
|
|
mob_faction = FACTION_WILD_ANIMAL
|
|
total_spawns = -1
|
|
destructible = 0
|
|
anchored = TRUE
|
|
invisibility = INVISIBILITY_ABSTRACT
|
|
spawn_types = list(
|
|
/mob/living/simple_mob/animal/passive/gaslamp = 20,
|
|
// /mob/living/simple_mob/vore/otie/feral = 10,
|
|
/mob/living/simple_mob/vore/aggressive/dino/virgo3b = 5,
|
|
/mob/living/simple_mob/vore/aggressive/dragon/virgo3b = 1
|
|
)
|
|
|
|
/obj/structure/mob_spawner/scanner/xenos
|
|
name = "Xenomorph Egg"
|
|
spawn_delay = 10 MINUTES
|
|
range = 10
|
|
simultaneous_spawns = 1
|
|
mob_faction = FACTION_XENO
|
|
total_spawns = -1
|
|
destructible = 1
|
|
health = 50
|
|
anchored = TRUE
|
|
icon = 'icons/mob/actions.dmi'
|
|
icon_state = "alien_egg"
|
|
spawn_types = list(
|
|
/mob/living/simple_mob/animal/space/alien/drone = 20,
|
|
/mob/living/simple_mob/animal/space/alien = 10,
|
|
/mob/living/simple_mob/animal/space/alien/sentinel = 5,
|
|
/mob/living/simple_mob/animal/space/alien/queen = 1
|
|
)
|
|
|
|
/obj/structure/mob_spawner/scanner/xenos/royal
|
|
name = "Royal Xenomorph Egg"
|
|
spawn_delay = 10 MINUTES
|
|
range = 10
|
|
simultaneous_spawns = 1
|
|
mob_faction = FACTION_XENO
|
|
total_spawns = 1
|
|
destructible = 1
|
|
health = 50
|
|
anchored = TRUE
|
|
icon = 'icons/mob/actions.dmi'
|
|
icon_state = "alien_egg"
|
|
spawn_types = list(
|
|
/mob/living/simple_mob/animal/space/alien/queen = 5,
|
|
)
|