Skip to content

Commit

Permalink
Converts Input List to TGUI Input Lists (#23396)
Browse files Browse the repository at this point in the history
* Part 1

* Testing 1

* Revert "Testing 1"

This reverts commit fc06554.

* Part 1.1

* Part 2 - UI Style List

* Preferences lists

* Preferences lists - DONE

* More inputs

* MOOOOOORE

* UI style else

* Last ones

* Double name fix

* Pre-selected Search

* Return Pick Darkness

* Return Pick Darkness

* Missing users

* Some review changes

* Revert MULE lists

* I just hate MERGE CONFLICT label

* List window tweaks

* I think there it is

* why i am stopid

* Update tgui.bundle.js
  • Loading branch information
AyIong authored Dec 10, 2023
1 parent fbf348f commit 825c2c8
Show file tree
Hide file tree
Showing 77 changed files with 181 additions and 166 deletions.
2 changes: 2 additions & 0 deletions code/__HELPERS/type2type.dm
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@
return 'icons/mob/screen_operative.dmi'
if("White")
return 'icons/mob/screen_white.dmi'
if("Midnight")
return 'icons/mob/screen_midnight.dmi'
else
return 'icons/mob/screen_midnight.dmi'

Expand Down
4 changes: 2 additions & 2 deletions code/_onclick/hud/ai_hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

/obj/screen/ai/camera_list/Click()
var/mob/living/silicon/ai/AI = usr
var/camera = input(AI, "Choose which camera you want to view", "Cameras") as null|anything in AI.get_camera_list()
var/camera = tgui_input_list(AI, "Choose which camera you want to view", "Cameras", AI.get_camera_list())
AI.ai_camera_list(camera)

/obj/screen/ai/camera_track
Expand All @@ -26,7 +26,7 @@
/obj/screen/ai/camera_track/Click()
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
var/target_name = input(AI) as null|anything in AI.trackable_mobs()
var/target_name = tgui_input_list(AI, "Choose a target you want to track", "Tracking", AI.trackable_mobs())
if(target_name)
AI.ai_camera_track(target_name)

Expand Down
2 changes: 1 addition & 1 deletion code/datums/components/surgery_initiator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@
procedure = S
break
else
procedure = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
procedure = tgui_input_list(user, "Begin which procedure?", "Surgery", available_surgeries)

if(!procedure)
return
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spell_targeting/matter_eater_targeting.dm
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
continue
possible_targets += O

var/atom/movable/target = input("Choose the target of your hunger.", "Targeting") as null|anything in possible_targets
var/atom/movable/target = tgui_input_list(user, "Choose the target of your hunger", "Targeting", possible_targets)

if(QDELETED(target))
return
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spell_targeting/remoteview_targeting.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
if(!length(remoteviewers))
return

var/mob/target = input("Choose the target to spy on.", "Targeting") as null|anything in remoteviewers
var/mob/target = tgui_input_list(user, "Choose the target to spy on", "Targeting", remoteviewers)

if(QDELETED(target))
return
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spell_targeting/targeted.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
else if(max_targets == 1) // Only one target
var/atom/target
if(!random_target)
target = input("Choose the target for the spell.", "Targeting") as anything in possible_targets
target = tgui_input_list(user, "Choose the target for the spell", "Targeting", possible_targets)
//Adds a safety check post-input to make sure those targets are actually in range.
if(target in view_or_range(range, spell_location, selection_type))
targets += target
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spell_targeting/telepathic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
if(!length(valid_targets))
return

var/target_name = input("Choose the target to listen to.", "Targeting") as null|anything in valid_targets
var/target_name = tgui_input_list(user, "Choose the target to listen to", "Targeting", valid_targets)

var/mob/living/target = valid_targets[target_name]
if(QDELETED(target))
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spells/mimic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
forms += "Original Form"

forms += available_forms.Copy()
var/what = input(user, "Which form do you want to become?", "Mimic") as null|anything in forms
var/what = tgui_input_list(user, "Which form do you want to become?", "Mimic", forms)
if(!what)
to_chat(user, "<span class='notice'>You decide against changing forms.</span>")
revert_cast(user)
Expand Down
2 changes: 1 addition & 1 deletion code/datums/spells/shapeshift.dm
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
for(var/path in possible_shapes)
var/mob/living/simple_animal/A = path
animal_list[initial(A.name)] = path
shapeshift_type = input(M, "Choose Your Animal Form!", "It's Morphing Time!", null) as anything in animal_list
shapeshift_type = tgui_input_list(M, "Choose Your Animal Form!", "It's Morphing Time!", animal_list)
if(!shapeshift_type) //If you aren't gonna decide I am!
shapeshift_type = pick(animal_list)
shapeshift_type = animal_list[shapeshift_type]
Expand Down
8 changes: 4 additions & 4 deletions code/game/gamemodes/cult/blood_magic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
possible_spells[cult_name] = J
if(length(spells))
possible_spells += "(REMOVE SPELL)"
entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells
entered_spell_name = tgui_input_list(owner, "Pick a blood spell to prepare...", "Spell Choices", possible_spells)
if(entered_spell_name == "(REMOVE SPELL)")
remove_spell()
return
Expand Down Expand Up @@ -80,8 +80,8 @@
SSblackbox.record_feedback("tally", "cult_spells_prepared", 1, "[new_spell.name]")
channeling = FALSE

/datum/action/innate/cult/blood_magic/proc/remove_spell(message = "Pick a spell to remove.")
var/nullify_spell = input(owner, message, "Current Spells") as null|anything in spells
/datum/action/innate/cult/blood_magic/proc/remove_spell()
var/nullify_spell = tgui_input_list(owner, "Pick a spell to remove", "Current Spells", spells)
if(nullify_spell)
qdel(nullify_spell)

Expand Down Expand Up @@ -518,7 +518,7 @@
log_game("Teleport spell failed - user in away mission")
return

var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
var/input_rune_key = tgui_input_list(user, "Choose a rune to teleport to", "Rune to Teleport to", potential_runes) //we know what key they picked
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
if(QDELETED(src) || !user || user.l_hand != src && user.r_hand != src || user.incapacitated() || !actual_selected_rune)
return
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cult/cult_items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -782,7 +782,7 @@
to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
return

var/input_rune_key = input(user, "Choose a rune to make a portal to.", "Rune to make a portal to") as null|anything in potential_runes //we know what key they picked
var/input_rune_key = tgui_input_list(user, "Choose a rune to make a portal to", "Rune to make a portal to", potential_runes) //we know what key they picked
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
if(QDELETED(R) || QDELETED(actual_selected_rune) || !Adjacent(user) || user.incapacitated())
return
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cult/ritual.dm
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@
if(!length(possible_runes))
return

var/chosen_rune = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
var/chosen_rune = tgui_input_list(user, "Choose a rite to scribe.", "Sigils of Power", possible_runes)
if(!chosen_rune)
return
var/obj/effect/rune/rune = possible_runes[chosen_rune]
Expand Down
6 changes: 3 additions & 3 deletions code/game/gamemodes/cult/runes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
return

var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
var/input_rune_key = tgui_input_list(user, "Choose a rune to teleport to.", "Rune to Teleport to", potential_runes) //we know what key they picked
var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
if(QDELETED(src) || QDELETED(actual_selected_rune) ||!Adjacent(user) || user.incapacitated())
fail_invoke()
Expand Down Expand Up @@ -631,7 +631,7 @@ structure_check() searches for nearby cultist structures required for the invoca
fail_invoke()
return
if(length(potential_revive_mobs) > 1)
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
mob_to_revive = tgui_input_list(user, "Choose a cultist to revive.", "Cultist to Revive", potential_revive_mobs)
else // If there's only one, no need for a menu
mob_to_revive = potential_revive_mobs[1]
if(!validness_checks(mob_to_revive, user))
Expand Down Expand Up @@ -753,7 +753,7 @@ structure_check() searches for nearby cultist structures required for the invoca
for(var/datum/mind/M in SSticker.mode.cult)
if(!(M.current in invokers) && M.current && M.current.stat != DEAD)
cultists[M.current.real_name] = M.current
var/input = input(user, "Who do you wish to call to [src]?", "Acolytes") as null|anything in cultists
var/input = tgui_input_list(user, "Who do you wish to call to [src]?", "Acolytes", cultists)
var/mob/living/cultist_to_summon = cultists[input]
if(QDELETED(src) || !Adjacent(user) || user.incapacitated())
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@
to_chat(usr, "<span class='warning'>There are no valid targets!</span>")
return

var/mob/living/target = input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
var/mob/living/target = tgui_input_list(user, "Choose the target to talk to", "Targeting", validtargets)
return target

/datum/action/innate/demon/whisper/Activate()
Expand Down
4 changes: 2 additions & 2 deletions code/game/gamemodes/nuclear/pinpointer.dm
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@
var/name = initial(T.name)
item_names += name
item_paths[name] = initial(T.typepath)
var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in item_names
var/targetitem = tgui_input_list(user, "Select item to search for", "Select Item", item_names)
if(!targetitem)
return

Expand Down Expand Up @@ -492,7 +492,7 @@
user.visible_message("<span class='notice'>[user]'s pinpointer fails to detect a signal.</span>", "<span class='notice'>Your pinpointer fails to detect a signal.</span>")
return

var/A = input(user, "Person to track", "Pinpoint") in names
var/A = tgui_input_list(user, "Person to track", "Pinpoint", names)
if(!src || !user || (user.get_active_hand() != src) || user.incapacitated() || !A)
return

Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/computer/atmos_controllers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(gas_sensors)
"-SAVE TO BUFFER-" = "multitool"
)

var/temp_answer = input(user, "Select an option to adjust", "Options!", null) as null|anything in options
var/temp_answer = tgui_input_list(user, "Select an option to adjust", "Options!", options)

if(!Adjacent(user))
break
Expand Down Expand Up @@ -191,7 +191,7 @@ GLOBAL_LIST_EMPTY(gas_sensors)
to_chat(user, "<span class='notice'>Successfully added a new sensor/meter with name <code>[new_name]</code></span>")

if("Remove")
var/to_remove = input(user, "Select a sensor/meter to remove", "Sensor/Meter Removal") as null|anything in sensor_name_uid_map
var/to_remove = tgui_input_list(user, "Select a sensor/meter to remove", "Sensor/Meter Removal", sensor_name_uid_map)
if(!to_remove)
return

Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/computer/buildandrepair.dm
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
var/choice = input(user, "Circuit Setting", "What would you change the board setting to?") as null|anything in monitor_names_paths
var/choice = tgui_input_list(user, "Circuit Setting", "What would you change the board setting to?", monitor_names_paths)
if(!choice)
return
board_name = choice
Expand Down Expand Up @@ -527,7 +527,7 @@
if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))
if(allowed(user))
user.visible_message("<span class='notice'>[user] waves [user.p_their()] ID past [src]'s access protocol scanner.</span>", "<span class='notice'>You swipe your ID past [src]'s access protocol scanner.</span>")
var/console_choice = input(user, "What do you want to configure the access to?", "Access Modification", "R&D Core") as null|anything in access_types
var/console_choice = tgui_input_list(user, "What do you want to configure the access to?", "Access Modification", access_types)
if(!console_choice)
return
switch(console_choice)
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/computer/camera_advanced.dm
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@


playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, 0)
var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T
var/camera = tgui_input_list(target, "Choose which camera you want to view", "Cameras", T)
var/obj/machinery/camera/final = T[camera]
playsound(origin, "terminal_type", 25, 0)
if(final)
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/computer/camera_console.dm
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre")
var/direction = tgui_input_list(user, "Which direction?", "Select direction", list("North", "East", "South", "West", "Centre"))
if(!direction || !Adjacent(user))
return
pixel_x = 0
Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/constructable_frame.dm
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ to destroy them and players will be able to make replacements.
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
var/choice = input(user, "Choose a new brand", "Select an Item") as null|anything in station_vendors
var/choice = tgui_input_list(user, "Choose a new brand", "Select an Item", station_vendors)
if(!choice)
return
set_type(choice)
Expand Down Expand Up @@ -569,7 +569,7 @@ to destroy them and players will be able to make replacements.
. = TRUE
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
var/choice = input(user, "Circuit Setting", "What would you change the board setting to?") as null|anything in fridge_names_paths
var/choice = tgui_input_list(user, "Circuit Setting", "What would you change the board setting to?", fridge_names_paths)
if(!choice)
return
set_type(user, choice)
Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/tcomms/tcomms_core.dm
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@

// Job Format
if("nttc_job_indicator_type")
var/card_style = input(usr, "Pick a job card format.", "Job Card Format") as null|anything in nttc.job_card_styles
var/card_style = tgui_input_list(usr, "Pick a job card format", "Job Card Format", nttc.job_card_styles)
if(!card_style)
return
nttc.job_indicator_type = card_style
Expand All @@ -268,7 +268,7 @@

// Language Settings
if("nttc_setting_language")
var/new_language = input(usr, "Pick a language to convert messages to.", "Language Conversion") as null|anything in nttc.valid_languages
var/new_language = tgui_input_list(usr, "Pick a language to convert messages to", "Language Conversion", nttc.valid_languages)
if(!new_language)
return
if(new_language == "--DISABLE--")
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/cardboard_cutouts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
if(pushed_over)
to_chat(user, "<span class='warning'>Right [src] first!</span>")
return
var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances
var/new_appearance = tgui_input_list(user, "Choose a new appearance for [src]", "26th Century Deception", possible_appearances)
if(!Adjacent(usr))
user.visible_message("<span class='danger'>You need to be closer!</span>")
return
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/collar.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
/obj/item/petcollar/attack_self(mob/user)
var/option = "Change Name"
if(access_id)
option = input(user, "What do you want to do?", "[src]", option) as null|anything in list("Change Name", "Remove ID")
option = tgui_input_list(user, "What do you want to do?", "[src]", list("Change Name", "Remove ID"))
if(QDELETED(src) || !Adjacent(user))
return
switch(option)
Expand Down
6 changes: 2 additions & 4 deletions code/game/objects/items/devices/enginepicker.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@
return

locatebeacons()
var/default = null
var/E = input("Select the station's Engine:", "[src]", default) as null|anything in list_enginebeacons
var/E = tgui_input_list(user, "Select the station's Engine", "[src]", list_enginebeacons)
if(E)
processchoice(E, user)
else
Expand All @@ -51,8 +50,7 @@
var/turf/T = get_turf(choice)

if(choice.enginetype.len > 1) //If the beacon has multiple engine types
var/default = null
var/E = input("You have selected a combined beacon, which option would you prefer?", "[src]", default) as null|anything in choice.enginetype
var/E = tgui_input_list(user, "You have selected a combined beacon, which option would you prefer?", "[src]", choice.enginetype)
if(E)
engtype = E
issuccessful = TRUE
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/devices/painter/airlock_painter.dm
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"Standard" = /obj/machinery/door/airlock)

/datum/painter/airlock/pick_color(mob/user)
var/choice = input(user, "Please select a paintjob.") as null|anything in available_paint_jobs
var/choice = tgui_input_list(user, "Please select a paintjob.", "Airlock painter", available_paint_jobs)
if(!choice)
return
paint_setting = choice
Expand Down
5 changes: 4 additions & 1 deletion code/game/objects/items/devices/painter/pipe_painter.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
paint_setting = pick(modes)

/datum/painter/pipe/pick_color(mob/user)
paint_setting = input("Which color do you want to use?", null, paint_setting) in modes
var/new_paint_setting = tgui_input_list(user, "Which color do you want to use?", "Pick color", modes)
if(!new_paint_setting)
return
paint_setting = new_paint_setting

/datum/painter/pipe/paint_atom(atom/target, mob/user)
if(!istype(target, /obj/machinery/atmospherics/pipe))
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/robot/robot_parts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
AddComponent(/datum/component/surgery_initiator/limb, forced_surgery = /datum/surgery/attach_robotic_limb)

/obj/item/robot_parts/attack_self(mob/user)
var/choice = input(user, "Select the company appearance for this limb.", "Limb Company Selection") as null|anything in GLOB.selectable_robolimbs
var/choice = tgui_input_list(user, "Select the company appearance for this limb", "Limb Company Selection", GLOB.selectable_robolimbs)
if(!choice)
return
if(loc != user)
Expand Down
4 changes: 2 additions & 2 deletions code/game/objects/items/weapons/scissors.dm
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@
to_chat(user, "<span class='warning'>[M] doesn't have a head!</span>")
return
//facial hair
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in H.generate_valid_facial_hairstyles()
var/f_new_style = tgui_input_list(user, "Select a facial hair style", "Grooming", H.generate_valid_facial_hairstyles())
//handle normal hair
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in H.generate_valid_hairstyles()
var/h_new_style = tgui_input_list(user, "Select a hair style", "Grooming", H.generate_valid_hairstyles())
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
playsound(loc, 'sound/goonstation/misc/scissor.ogg', 100, 1)
if(do_after(user, 50 * toolspeed, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/scrolls.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
return

var/picked_area
picked_area = input(user, "Area to jump to", "Teleport where?", picked_area) as null|anything in SSmapping.teleportlocs
picked_area = tgui_input_list(user, "Area to jump to", "Teleport where?", SSmapping.teleportlocs)
if(!picked_area)
return

Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/storage/boxes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,7 @@
to_chat(user, "<span class='warning'>You can't modify [src] with items still inside!</span>")
return
var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILE)
var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) as null|anything in designs
var/switchDesign = tgui_input_list(user, "Select a Design", "Paper Sack Design", designs)
if(!switchDesign)
return
if(get_dist(usr, src) > 1 && !usr.incapacitated())
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/teleportation.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
turfs += T
if(turfs.len)
L["None (Dangerous)"] = pick(turfs)
var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") as null|anything in L
var/t1 = tgui_input_list(user, "Please select a teleporter to lock in on.", "Hand Teleporter", L)
if(!t1 || (!user.is_in_active_hand(src) || user.stat || user.restrained()))
return
if(active_portals >= 3)
Expand Down
Loading

0 comments on commit 825c2c8

Please sign in to comment.