diff --git a/code/ZAS/ZAS_Zones.dm b/code/ZAS/ZAS_Zones.dm index c463b1550c..3e62d95d11 100644 --- a/code/ZAS/ZAS_Zones.dm +++ b/code/ZAS/ZAS_Zones.dm @@ -411,7 +411,7 @@ zone/proc/Rebuild() // var/list/turfs_to_consider = contents.Copy() - while(!sample.CanPass(null, sample, 1.5, 1)) + while(!sample || !sample.CanPass(null, sample, 1.5, 1)) if(sample) turfs_to_consider.Remove(sample) sample = locate() in turfs_to_consider diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 4100eb645a..5bdf700ff8 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -311,7 +311,10 @@ var/global/datum/controller/gameticker/ticker if(!delay_end) sleep(restart_timeout) - world.Reboot() + if(!delay_end) + world.Reboot() + else + world << "\blue An admin has delayed the round end" else world << "\blue An admin has delayed the round end" diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index dcfa843d4a..f28de56dc4 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -22,6 +22,8 @@ proc/load_alienwhitelist() //todo: admin aliens /proc/is_alien_whitelisted(mob/M, var/species) + if(!config.usealienwhitelist) + return 1 if(species == "human" || species == "Human") return 1 if(check_rights(R_ADMIN, 0)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index bcde604126..daea3219d6 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -9,7 +9,6 @@ layer = 5 var/list/network = list("SS13") - var/network_multi = "" //This is for when you want to place a camera on the map. Input them as a string seperated by commas "SS13,RD,SomeOtherNetwork" var/c_tag = null var/c_tag_order = 999 var/status = 1.0 @@ -45,24 +44,27 @@ if(C != src && C.c_tag == src.c_tag && tempnetwork.len) world.log << "[src.c_tag] [src.x] [src.y] [src.z] conflicts with [C.c_tag] [C.x] [C.y] [C.z]" */ + if(!src.network || src.network.len < 1) + if(loc) + error("[src.name] in [get_area(src)] (x:[src.x] y:[src.y] z:[src.z] has errored. [src.network?"Empty network list":"Null network list"]") + else + error("[src.name] in [get_area(src)]has errored. [src.network?"Empty network list":"Null network list"]") + ASSERT(src.network) + ASSERT(src.network.len > 0) ..() -/obj/machinery/camera/initialize() //Lists dont work in the map editor so we have to translate a string into a list when the map initializes - if(network_multi) - network = text2list(network_multi,",") - /obj/machinery/camera/emp_act(severity) if(!isEmpProof()) if(prob(100/severity)) icon_state = "[initial(icon_state)]emp" - for(var/i in network) - network.Remove(i) //Not the best way but it will do. I think. + var/list/previous_network = network + network = list() cameranet.removeCamera(src) stat |= EMPED SetLuminosity(0) triggerCameraAlarm() spawn(900) - network = initial(network) + network = previous_network icon_state = initial(icon_state) stat &= ~EMPED cancelCameraAlarm() diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index c27ae7faa8..311f8d8810 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -69,8 +69,6 @@ /obj/machinery/iv_drip/process() set background = 1 - ..() - if(src.attached) if(!(get_dist(src, src.attached) <= 1)) visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") @@ -101,7 +99,12 @@ var/mob/living/carbon/human/T = attached if(!istype(T)) return - var/datum/reagent/B = new /datum/reagent/blood + var/datum/reagent/B + for(var/datum/reagent/blood/Blood in beaker.reagents.reagent_list) + if(Blood.data && Blood.data["blood_type"]==T.dna.b_type) + B = Blood + break + if(!B) B = new /datum/reagent/blood if(!T.dna) return if(NOCLONE in T.mutations) @@ -112,7 +115,7 @@ if(T.vessel.get_reagent_amount("blood") < amount) return B.holder = beaker - B.volume = amount + B.volume += amount //set reagent data B.data["donor"] = T @@ -121,7 +124,10 @@ B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) if(T.resistances && T.resistances.len) - B.data["resistances"] = T.resistances.Copy() + if(B.data["resistances"]) + B.data["resistances"] |= T.resistances.Copy() + else + B.data["resistances"] = T.resistances.Copy() B.data["blood_type"] = copytext(T.dna.b_type,1,0) @@ -130,14 +136,15 @@ temp_chem += R.name temp_chem[R.name] = R.volume B.data["trace_chem"] = list2params(temp_chem) - B.data["antibodies"] = T.antibodies + B.data["antibodies"] |= T.antibodies T.vessel.remove_reagent("blood",amount) // Removes blood if human - beaker.reagents.reagent_list += B + beaker.reagents.reagent_list |= B beaker.reagents.update_total() beaker.on_reagent_change() beaker.reagents.handle_reactions() + update_icon() /obj/machinery/iv_drip/attack_hand(mob/user as mob) if(src.beaker) @@ -168,6 +175,11 @@ ..() if (!(usr in view(2)) && usr!=src.loc) return + if(mode == "take") + usr << "The IV drip is taking blood." + else if(mode == "give") + usr << "The IV drip is injecting." + if(beaker) usr << "\blue Attached is \a [beaker] with:" if(beaker.reagents && beaker.reagents.reagent_list.len) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 5ad8639246..ac9ac1564b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -39,7 +39,7 @@ //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine. var/seconds_electrified = 0 //Shock customers like an airlock. var/shoot_inventory = 0 //Fire items at customers! We're broken! - var/shut_up = 0 //Stop spouting those godawful pitches! + var/shut_up = 1 //Stop spouting those godawful pitches! var/extended_inventory = 0 //can we access the hidden inventory? var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar. var/wires = 15 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 4c1a875e11..225318a9b8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -18,7 +18,7 @@ unacidable = 1 //and no deleting hoomans inside layer = MOB_LAYER //icon draw layer infra_luminosity = 15 //byond implementation is bugged. - var/initial_icon = "" //Mech type for resetting icon. + var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) var/can_move = 1 var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. @@ -1655,7 +1655,10 @@ return 0 /obj/mecha/proc/reset_icon() - icon_state = initial_icon + if (initial_icon) + icon_state = initial_icon + else + icon_state = initial(icon_state) return icon_state ////////////////////////////////////////// diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index faf10759c2..964fe96435 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -226,6 +226,7 @@ user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" ) + msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG //spawn(1800) // this wont work right // M.lastattacker = null diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 50e1c58c4d..4e7ae4d648 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -131,6 +131,12 @@ move an amendment to the drawing.

A.power_environ = 0 A.always_unpowered = 0 move_turfs_to_area(turfs, A) + + A.always_unpowered = 0 + for(var/turf/T in A.contents) + T.lighting_changed = 1 + lighting_controller.changed_turfs += T + spawn(5) //ma = A.master ? "[A.master]" : "(null)" //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]" diff --git a/code/game/objects/items/stacks/tiles/plasteel.dm b/code/game/objects/items/stacks/tiles/plasteel.dm index 212cec051d..cbbf1811cc 100644 --- a/code/game/objects/items/stacks/tiles/plasteel.dm +++ b/code/game/objects/items/stacks/tiles/plasteel.dm @@ -36,7 +36,10 @@ */ /obj/item/stack/tile/plasteel/proc/build(turf/S as turf) - S.ChangeTurf(/turf/simulated/floor/plating) + if (istype(S,/turf/space)) + S.ChangeTurf(/turf/simulated/floor/plating/airless) + else + S.ChangeTurf(/turf/simulated/floor/plating) // var/turf/simulated/floor/W = S.ReplaceWithFloor() // W.make_plating() return \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index f0f8a3ce00..fcb0012287 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -106,6 +106,7 @@ icon_state = "securitybelt" item_state = "security"//Could likely use a better one. storage_slots = 7 + max_w_class = 3 can_hold = list( "/obj/item/weapon/grenade/flashbang", "/obj/item/weapon/reagent_containers/spray/pepper", diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 619ca94700..d4e291c132 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -439,3 +439,24 @@ icon = 'icons/obj/items.dmi' icon_state = "red_crowbar" item_state = "crowbar_red" + +/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob) + if(hasorgans(M)) + var/datum/organ/external/S = M:organs_by_name[user.zone_sel.selecting] + if (!S) return + if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") + return ..() + if(S.brute_dam) + S.heal_damage(15,0,0,1) + if(user != M) + user.visible_message("\red You patch some dents on \the [M]'s [S.display_name]",\ + "\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\ + "You hear a welder.") + else + user.visible_message("\red You patch some dents on your [S.display_name]",\ + "\red \The [user] patches some dents on their [S.display_name] with \the [src]",\ + "You hear a welder.") + else + user << "Nothing to fix!" + else + return ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 19bb40f562..cffd234777 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -30,6 +30,9 @@ manual_unbuckle(user) return +/obj/structure/stool/bed/MouseDrop(atom/over_object) + return + /obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob) if(!istype(M)) return buckle_mob(M, user) @@ -151,4 +154,4 @@ new/obj/item/roller(get_turf(src)) spawn(0) del(src) - return + return diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 412a4065fa..42a251468a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -231,10 +231,12 @@ W.zone = src.zone W.zone.AddTurf(W) + for(var/turf/simulated/T in orange(src,1)) + air_master.tiles_to_update.Add(T) + W.levelupdate() return W else - /*if(istype(src, /turf/simulated) && src.zone) src.zone.rebuild = 1*/ @@ -249,6 +251,9 @@ W.zone = src.zone W.zone.AddTurf(W) + for(var/turf/simulated/T in orange(src,1)) + air_master.tiles_to_update.Add(T) + W.levelupdate() return W diff --git a/code/modules/DetectiveWork/footprints_and_rag.dm b/code/modules/DetectiveWork/footprints_and_rag.dm index 1592f1c6f4..5f8918c907 100644 --- a/code/modules/DetectiveWork/footprints_and_rag.dm +++ b/code/modules/DetectiveWork/footprints_and_rag.dm @@ -1,4 +1,3 @@ - /mob var/bloody_hands = 0 @@ -11,15 +10,13 @@ var/transfer_blood = 0 var/mob/living/carbon/human/bloody_hands_mob - - -/proc/blood_incompatible(donor,receiver) - - var/donor_antigen = copytext(donor,1,lentext(donor)) - var/receiver_antigen = copytext(receiver,1,lentext(receiver)) - var/donor_rh = findtext("+",donor) - var/receiver_rh = findtext("+",receiver) - +proc/blood_incompatible(donor,receiver) + if(!donor || !receiver) return 0 + var + donor_antigen = copytext(donor,1,lentext(donor)) + receiver_antigen = copytext(receiver,1,lentext(receiver)) + donor_rh = (findtext(donor,"+")>0) + receiver_rh = (findtext(receiver,"+")>0) if(donor_rh && !receiver_rh) return 1 switch(receiver_antigen) if("A") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 90bfff08c1..ab92cafbad 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -7,18 +7,19 @@ var/global/floorIsLava = 0 /proc/message_admins(var/msg) msg = "ADMIN LOG: [msg]" log_adminwarn(msg) - admins << msg + for(var/client/C in admins) + if(R_ADMIN & C.holder.rights) + C << msg -/* /proc/msg_admin_attack(var/text) //Toggleable Attack Messages var/rendered = "ADMIN LOG: [text]" log_adminwarn(rendered) for(var/client/C in admins) - if (C.holder.level >= 1) - if(!C.STFU_atklog) + if(R_ADMIN & C.holder.rights) + if(C.prefs.toggles & CHAT_ATTACKLOGS) var/msg = rendered C << msg -*/ + ///////////////////////////////////////////////////////////////////////////////////////////////Panels @@ -756,10 +757,15 @@ var/global/floorIsLava = 0 /datum/admins/proc/delay() set category = "Server" - set desc="Delay the game start" + set desc="Delay the game start/end" set name="Delay" + + if(!check_rights(R_ADMIN)) return if (!ticker || ticker.current_state != GAME_STATE_PREGAME) - return alert("Too late... The game has already started!", null, null, null, null, null) + ticker.delay_end = !ticker.delay_end + log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") + message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if (!( going )) world << "The game start has been delayed." @@ -1084,4 +1090,4 @@ proc/move_alien_ship() alien_ship_location = 0 else alien_ship_location = 1 - return \ No newline at end of file + return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 46ba545792..67f32a7188 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -7,6 +7,7 @@ var/list/admin_verbs_default = list( /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/ /client/proc/check_antagonists, /*shows all antags*/ + /client/proc/deadchat /*toggles deadchat on/off*/ ) var/list/admin_verbs_admin = list( /client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/ @@ -46,7 +47,6 @@ var/list/admin_verbs_admin = list( /client/proc/check_words, /*displays cult-words*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ - /client/proc/deadchat, /*toggles deadchat on/off*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/toggleprayers, /*toggles prayers on/off*/ // /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/ @@ -62,13 +62,15 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/show_player_info, /client/proc/free_slot, /*frees slot for chosen job*/ /client/proc/cmd_admin_change_custom_event, - /client/proc/cmd_admin_rejuvenate + /client/proc/cmd_admin_rejuvenate, + /client/proc/toggleattacklogs, + /datum/admins/proc/show_skills ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, /client/proc/jobbans, /client/proc/unjobban_panel, - /client/proc/DB_ban_panel + // /client/proc/DB_ban_panel ) var/list/admin_verbs_sounds = list( /client/proc/play_local_sound, @@ -88,7 +90,8 @@ var/list/admin_verbs_fun = list( /client/proc/cmd_admin_add_random_ai_law, /client/proc/make_sound, /client/proc/toggle_random_events, - /client/proc/set_ooc + /client/proc/set_ooc, + /client/proc/editappear ) var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_atom, /*allows us to spawn instances*/ @@ -222,6 +225,7 @@ var/list/admin_verbs_mod = list( /client/proc/cmd_mod_say, /datum/admins/proc/show_player_info, /client/proc/player_panel_new, + /datum/admins/proc/show_skills ) /client/proc/add_admin_verbs() if(holder) @@ -632,12 +636,9 @@ var/list/admin_verbs_mod = list( set name = "Edit Appearance" set category = "Fun" - usr << "\red This proc has been temporarily disabled." - return + if(!check_rights(R_FUN)) return - //some random errors here, cbb fixing them right now - //todo - /*if(!istype(M, /mob/living/carbon/human)) + if(!istype(M, /mob/living/carbon/human)) usr << "\red You can only do this to humans!" return switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Soghun and Tajaran can result in unintended consequences.",,"Yes","No")) @@ -668,49 +669,14 @@ var/list/admin_verbs_mod = list( M.s_tone = -M.s_tone + 35 // hair - var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair - var/list/hairs = list() - - // loop through potential hairs - for(var/x in all_hairs) - var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x - hairs.Add(H.name) // add hair name to hairs - del(H) // delete the hair after it's all done - - var/new_style = input("Please select hair style", "Character Generation") as null|anything in hairs - - // if new style selected (not cancel) - if (new_style) - M.h_style = new_style - - for(var/x in all_hairs) // loop through all_hairs again. Might be slightly CPU expensive, but not significantly. - var/datum/sprite_accessory/hair/H = new x // create new hair datum - if(H.name == new_style) - M.hair_style = H // assign the hair_style variable a new hair datum - break - else - del(H) // if hair H not used, delete. BYOND can garbage collect, but better safe than sorry + var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list + if(new_hstyle) + M.h_style = new_hstyle // facial hair - var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair - var/list/fhairs = list() - - for(var/x in all_fhairs) - var/datum/sprite_accessory/facial_hair/H = new x - fhairs.Add(H.name) - del(H) - - new_style = input("Please select facial style", "Character Generation") as null|anything in fhairs - - if(new_style) - M.f_style = new_style - for(var/x in all_fhairs) - var/datum/sprite_accessory/facial_hair/H = new x - if(H.name == new_style) - M.facial_hair_style = H - break - else - del(H) + var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list + if(new_fstyle) + M.f_style = new_fstyle var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female") if (new_gender) @@ -718,10 +684,10 @@ var/list/admin_verbs_mod = list( M.gender = MALE else M.gender = FEMALE - M.rebuild_appearance() + M.update_hair() M.update_body() M.check_dna(M) - */ + /client/proc/playernotes() set name = "Show Player Info" set category = "Admin" @@ -744,3 +710,13 @@ var/list/admin_verbs_mod = list( if (job) job_master.FreeRole(job) return + +/client/proc/toggleattacklogs() + set name = "Toggle Attack Log Messages" + set category = "Preferences" + + prefs.toggles ^= CHAT_ATTACKLOGS + if (prefs.toggles & CHAT_ATTACKLOGS) + usr << "You now will get attack log messages" + else + usr << "You now won't get attack log messages" \ No newline at end of file diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 444c2f67ee..097540fa58 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -83,7 +83,7 @@ body += "SM - " body += "JMP
" if(antagonist > 0) - body += "Antagonist"; + body += "Antagonist"; body += ""; @@ -194,7 +194,7 @@ Player panel
- Hover over a line to see more information - Check antagonists + Hover over a line to see more information - Check antagonists

diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1900b35300..142adb0a3d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1254,7 +1254,7 @@ show_player_panel(M) else if(href_list["adminplayerobservejump"]) - if(!check_rights(R_ADMIN|R_MOD)) return + if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return var/mob/M = locate(href_list["adminplayerobservejump"]) @@ -1263,6 +1263,9 @@ sleep(2) C.jumptomob(M) + else if(href_list["check_antagonist"]) + check_antagonists() + else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN)) return @@ -2197,8 +2200,6 @@ if(!job) continue dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
" usr << browse(dat, "window=jobdebug;size=600x500") - if("check_antagonist") - check_antagonists() if("showailaws") output_ai_laws() if("showgm") @@ -2215,6 +2216,8 @@ dat += text("[][]", H.name, H.get_assignment()) dat += "" usr << browse(dat, "window=manifest;size=440x410") + if("check_antagonist") + check_antagonists() if("DNA") var/dat = "Showing DNA from blood.


" dat += "" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 6c96fa0f17..597ffc6d06 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -87,16 +87,17 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(!mob) return //this doesn't happen var/ref_mob = "\ref[mob]" - msg = "\blue HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" + msg = "\blue HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]" //send this msg to all admins var/admin_number_afk = 0 for(var/client/X in admins) - if(X.is_afk()) - admin_number_afk++ - if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' - X << msg + if((R_ADMIN|R_MOD) & X.holder.rights) + if(X.is_afk()) + admin_number_afk++ + if(X.prefs.toggles & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' + X << msg //show it to the person adminhelping too src << "PM to-Admins: [original_msg]" diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 3acf689d36..b247a74f38 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -11,10 +11,9 @@ if(check_rights(R_ADMIN,0)) msg = "ADMIN: [key_name(usr, 1)] (JMP): [msg]" - admins << msg - else - msg = "ADMIN: [key_name(usr, 1)]: [msg]" - admins << msg + for(var/client/C in admins) + if(R_ADMIN & C.holder.rights) + C << msg feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -23,28 +22,17 @@ set name = "Msay" set hidden = 1 - if (!src.holder) - src << "Only administrators may use this command." - return - - //todo: what? why does this not compile - /*if (src.muted || src.muted_complete) - src << "You are muted." - return*/ + if(!check_rights(R_ADMIN|R_MOD)) return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) log_admin("MOD: [key_name(src)] : [msg]") - if (!msg) return - //feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - for (var/mob/M in world) - if (M.client && M.client.holder) - if (src.holder.rank == "Admin Observer") - M << "MOD: [key_name(usr, M,1)]: [msg]" - else if (src.holder.rank == "Moderator") - M << "MOD: [key_name(usr, M,1)] (JMP): [msg]" - else - M << "MOD: [key_name(usr, M,1)] (JMP): [msg]" + var/color = "mod" + if (check_rights(R_ADMIN,0)) + color = "adminmod" + msg = "MOD: [key_name(src)] (JMP): [msg]" + for(var/client/C in admins) + if((R_ADMIN|R_MOD) & C.holder.rights) + C << msg diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 975c623e9b..cbdde7cca8 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -474,7 +474,7 @@ Traitors and the like can also be revived with the previous role mostly intact. switch(alert("Should this be announced to the general population?",,"Yes","No")) if("Yes") - command_alert(input, maintitle=customname); + command_alert(input, customname); if("No") world << "\red New NanoTrasen Update available at all communication consoles." diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 8bd9179cfd..0fc8004787 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -1,3 +1,4 @@ +// dmm_suite{ load_map(var/dmm_file as file, var/z_offset as num){ if(!z_offset){ @@ -20,6 +21,7 @@ dmm_suite{ var/ycrd=0 var/xcrd=0 for(var/zpos=findtext(tfile,"\n(1,1,");TRUE;zpos=findtext(tfile,"\n(1,1,",zpos+1,0)){ + if(zpos==0) break zcrd++ world.maxz = max(world.maxz, zcrd+z_offset) ycrd=0 @@ -43,7 +45,7 @@ dmm_suite{ if(gpos+length(grid_line)+1>length(zgrid)){break} sleep(-1) } - if(findtext(tfile,quote+"}",zpos,0)+2==tfile_len){break} + if(findtext(tfile,quote+"}",zpos,0)+2>=tfile_len){break} sleep(-1) } } diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index e736d23610..fc5e7dbf6a 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -4,7 +4,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "rig0-engineering" item_state = "eng_helm" - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 60) + armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight) var/brightness_on = 4 //luminosity when on var/on = 0 @@ -41,8 +41,8 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "rig-engineering" item_state = "eng_hardsuit" - slowdown = 2 - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 60) + slowdown = 1 + armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE @@ -74,6 +74,7 @@ item_state = "mining_hardsuit" + //Syndicate rig /obj/item/clothing/head/helmet/space/rig/syndi name = "blood-red hardsuit helmet" @@ -82,6 +83,7 @@ color = "syndi" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) + /obj/item/clothing/suit/space/rig/syndi icon_state = "rig-syndi" name = "blood-red hardsuit" @@ -91,6 +93,7 @@ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) + //Wizard Rig /obj/item/clothing/head/helmet/space/rig/wizard name = "gem-encrusted hardsuit helmet" @@ -123,17 +126,21 @@ name = "medical hardsuit" item_state = "medical_hardsuit" allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical) + slowdown = 2.0 //Security /obj/item/clothing/head/helmet/space/rig/security name = "security hardsuit helmet" icon_state = "rig0-sec" item_state = "sec_helm" color = "sec" + armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + /obj/item/clothing/suit/space/rig/security icon_state = "rig-sec" name = "security hardsuit" item_state = "sec_hardsuit" - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank, /obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + allowed = list(/obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton) //Atmospherics Rig (BS12) /obj/item/clothing/head/helmet/space/rig/atmos @@ -142,12 +149,14 @@ icon_state = "rig0-atmos" item_state = "atmos_helm" color = "atmos" - armor = list(melee = 35, bullet = 5, laser = 15,energy = 5, bomb = 30, bio = 100, rad = 5) + armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0) + max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE /obj/item/clothing/suit/space/rig/atmos desc = "A special suit that protects against hazardous, low pressure environments. Has reduced radiation shielding to allow for greater mobility." icon_state = "rig-atmos" name = "atmos hardsuit" item_state = "atmos_hardsuit" - armor = list(melee = 35, bullet = 5, laser = 15,energy = 5, bomb = 30, bio = 100, rad = 5) + armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen) + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 3539b4342c..b6894719a1 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/assemblies.dmi' icon_state = "posibrain" w_class = 3 - origin_tech = "engineering=4;materials=4;bluespace=2;programming=6" + origin_tech = "engineering=4;materials=4;bluespace=2;programming=4" var/list/construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10) var/construction_time = 75 @@ -68,7 +68,8 @@ src.brainmob << "You are a positronic brain, brought into existence on [station_name()]." src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI." - src.brainmob << "Use say :b to speak to other artificial intelligences on the station." + src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." + src.brainmob << "Use say :b to speak to other artificial intelligences." src.brainmob.mind.assigned_role = "Positronic Brain" var/turf/T = get_turf_or_move(src.loc) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index a4891b8c7c..2be4507483 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -459,7 +459,7 @@ species_allowed = list("Tajaran") taj_ears_spiky - name = "Spiky" + name = "Tajaran Spiky" icon_state = "hair_tajspiky" species_allowed = list("Tajaran") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 7d8b42e1d0..8245e850b1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -550,4 +550,24 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/weapon/cable_coil/random/New() color = pick("red","yellow","green","blue","pink") icon_state = "coil_[color]" - ..() \ No newline at end of file + ..() + +/obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob) + if(hasorgans(M)) + var/datum/organ/external/S = M:get_organ(user.zone_sel.selecting) + if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help") + return ..() + if(S.burn_dam > 0 && use(1)) + S.heal_damage(0,15,0,1) + if(user != M) + user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\ + "\red You repair some burn damage on your [S.display_name]",\ + "You hear wires being cut.") + else + user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\ + "\red You repair some burn damage on your [S.display_name]",\ + "You hear wires being cut.") + else + user << "Nothing to fix!" + else + return ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 046f904db6..cd761499fe 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -70,6 +70,8 @@ user << "You turn on the [src]." src.shot_number = 0 src.fire_delay = 100 + message_admins("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) + log_game("Emitter turned on by [user.ckey]([user]) in ([x],[y],[z])") investigate_log("turned on by [user.key]","singulo") update_icon() else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 801d50fdd2..cbeb12baae 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -95,10 +95,11 @@ M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]" firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]" log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src.type]") - + msg_admin_attack("ATTACK: [firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG else M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]" log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src.type]") + msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG spawn(0) if(A) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 74f63060c0..a3299a4e5d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -109,9 +109,25 @@ datum trans_data = current_reagent.data if(current_reagent.id == "blood" && ishuman(target)) // can never be sure var/mob/living/carbon/human/H = target - H.vessel.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) + + var/datum/reagent/blood/HisBlood = locate() in H.vessel.reagent_list //Grab some blood + if(HisBlood) // Make sure there's some blood at all + if(HisBlood.data["donor"] != H) //If it's not theirs, then we look for theirs + for(var/datum/reagent/blood/D in H.vessel.reagent_list) + if(D.data["donor"] == H) + HisBlood = D + break + if(HisBlood && HisBlood.data && trans_data) + if(blood_incompatible(trans_data["blood_type"],HisBlood.data["blood_type"])) + H.reagents.add_reagent("toxin",(current_reagent_transfer * multiplier * 0.5)) + H.reagents.update_total() + else + H.vessel.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) + H.vessel.update_total() + else + H.vessel.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) + H.vessel.update_total() src.remove_reagent(current_reagent.id, current_reagent_transfer) - H.vessel.update_total() else R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data) src.remove_reagent(current_reagent.id, current_reagent_transfer) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 0de3cf6b09..7dd051367d 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -297,13 +297,6 @@ datum ..() return - tramadol - name = "Tramadol" - id = "tramadol" - description = "A simple, yet effective painkiller." - reagent_state = LIQUID - color = "#C8A5DC" - toxin name = "Toxin" id = "toxin" @@ -1912,21 +1905,21 @@ datum return else if ( mouth_covered ) // Reduced effects if partially protected victim << "\red Your [safe_thing] protect you from most of the pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 15) - victim.eye_blind = max(M.eye_blind, 5) + victim.eye_blurry = max(M.eye_blurry, 3) + victim.eye_blind = max(M.eye_blind, 1) victim.Paralyse(1) victim.drop_item() return else if ( eyes_covered ) // Eye cover is better than mouth cover victim << "\red Your [safe_thing] protects your eyes from the pepperspray!" victim.emote("scream") - victim.eye_blurry = max(M.eye_blurry, 5) + victim.eye_blurry = max(M.eye_blurry, 1) return else // Oh dear :D victim.emote("scream") victim << "\red You're sprayed directly in the eyes with pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 25) - victim.eye_blind = max(M.eye_blind, 10) + victim.eye_blurry = max(M.eye_blurry, 5) + victim.eye_blind = max(M.eye_blind, 2) victim.Paralyse(1) victim.drop_item() diff --git a/code/setup.dm b/code/setup.dm index 7cd2383754..33202de26f 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -124,7 +124,7 @@ #define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C #define PLASMA_UPPER_TEMPERATURE 1370+T0C #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 -#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 +#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 20 #define PLASMA_OXYGEN_FULLBURN 10 #define T0C 273.15 // 0degC @@ -617,8 +617,9 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define CHAT_GHOSTSIGHT 128 #define CHAT_PRAYER 256 #define CHAT_RADIO 512 +#define CHAT_ATTACKLOGS 1024 -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS) #define BE_TRAITOR 1 #define BE_OPERATIVE 2 diff --git a/code/world.dm b/code/world.dm index 5c572892e2..2efd352dcf 100644 --- a/code/world.dm +++ b/code/world.dm @@ -32,6 +32,8 @@ LoadBansjob() if(config.usewhitelist) load_whitelist() + if(config.usealienwhitelist) + load_alienwhitelist() jobban_loadbanfile() jobban_updatelegacybans() LoadBans()
NameDNABlood Type