mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
- Instead of using expensive getFlatIcon() calls, character previews are now shown using screen objects in a second map window. - Edited skin to add a named window for preferences setup that contains a browser plus a new map window to show the previews. - Mannequins are still generated the same way, but now a MA is applied to four screen objects which are shown in the second map window. - The screen objects are deleted on close of the preferences window. So we do make sure to close it when spawning.
626 lines
22 KiB
Plaintext
626 lines
22 KiB
Plaintext
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
|
|
|
/mob/new_player
|
|
var/ready = 0
|
|
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
|
|
var/totalPlayers = 0 //Player counts for the Lobby tab
|
|
var/totalPlayersReady = 0
|
|
var/show_hidden_jobs = 0 //Show jobs that are set to "Never" in preferences
|
|
var/datum/browser/panel
|
|
universal_speak = 1
|
|
|
|
invisibility = 101
|
|
|
|
density = 0
|
|
stat = 2
|
|
canmove = 0
|
|
|
|
anchored = 1 // don't get pushed around
|
|
|
|
/mob/new_player/New()
|
|
mob_list += src
|
|
initialized = TRUE // Explicitly don't use Initialize(). New players join super early and use New()
|
|
|
|
/mob/new_player/verb/new_player_panel()
|
|
set src = usr
|
|
new_player_panel_proc()
|
|
|
|
|
|
/mob/new_player/proc/new_player_panel_proc()
|
|
var/output = "<div align='center'>"
|
|
output +="<hr>"
|
|
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Character Setup</A></p>"
|
|
|
|
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME)
|
|
if(ready)
|
|
output += "<p>\[ <span class='linkOn'><b>Ready</b></span> | <a href='byond://?src=\ref[src];ready=0'>Not Ready</a> \]</p>"
|
|
else
|
|
output += "<p>\[ <a href='byond://?src=\ref[src];ready=1'>Ready</a> | <span class='linkOn'><b>Not Ready</b></span> \]</p>"
|
|
|
|
else
|
|
output += "<a href='byond://?src=\ref[src];manifest=1'>View the Crew Manifest</A><br><br>"
|
|
output += "<p><a href='byond://?src=\ref[src];late_join=1'>Join Game!</A></p>"
|
|
|
|
output += "<p><a href='byond://?src=\ref[src];observe=1'>Observe</A></p>"
|
|
|
|
if(!IsGuestKey(src.key))
|
|
establish_db_connection()
|
|
|
|
if(dbcon.IsConnected())
|
|
var/isadmin = 0
|
|
if(src.client && src.client.holder)
|
|
isadmin = 1
|
|
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")")
|
|
query.Execute()
|
|
var/newpoll = 0
|
|
while(query.NextRow())
|
|
newpoll = 1
|
|
break
|
|
|
|
if(newpoll)
|
|
output += "<p><b><a href='byond://?src=\ref[src];showpoll=1'>Show Player Polls</A> (NEW!)</b></p>"
|
|
else
|
|
output += "<p><a href='byond://?src=\ref[src];showpoll=1'>Show Player Polls</A></p>"
|
|
|
|
if(client.check_for_new_server_news())
|
|
output += "<p><b><a href='byond://?src=\ref[src];shownews=1'>Show News</A> (NEW!)</b></p>"
|
|
else
|
|
output += "<p><a href='byond://?src=\ref[src];shownews=1'>Show News</A></p>"
|
|
|
|
if(SSsqlite.can_submit_feedback(client))
|
|
output += "<p>[href(src, list("give_feedback" = 1), "Give Feedback")]</p>"
|
|
output += "</div>"
|
|
|
|
panel = new(src, "Welcome","Welcome", 210, 300, src)
|
|
panel.set_window_options("can_close=0")
|
|
panel.set_content(output)
|
|
panel.open()
|
|
return
|
|
|
|
/mob/new_player/Stat()
|
|
..()
|
|
|
|
if(statpanel("Lobby") && SSticker)
|
|
stat("Game Mode:", SSticker.hide_mode ? "Secret" : "[config.mode_names[master_mode]]")
|
|
|
|
if(SSvote.mode)
|
|
stat("Vote: [capitalize(SSvote.mode)]", "Time Left: [SSvote.time_remaining] s")
|
|
|
|
if(SSticker.current_state == GAME_STATE_INIT)
|
|
stat("Time To Start:", "Server Initializing")
|
|
|
|
else if(SSticker.current_state == GAME_STATE_PREGAME)
|
|
stat("Time To Start:", "[round(SSticker.pregame_timeleft,1)][round_progressing ? "" : " (DELAYED)"]")
|
|
stat("Players: [totalPlayers]", "Players Ready: [totalPlayersReady]")
|
|
totalPlayers = 0
|
|
totalPlayersReady = 0
|
|
var/datum/job/refJob = null
|
|
for(var/mob/new_player/player in player_list)
|
|
refJob = player.client.prefs.get_highest_job()
|
|
stat("[player.key]", (player.ready)?("(Playing as: [(refJob)?(refJob.title):("Unknown")])"):(null))
|
|
totalPlayers++
|
|
if(player.ready)totalPlayersReady++
|
|
|
|
/mob/new_player/Topic(href, href_list[])
|
|
if(!client) return 0
|
|
|
|
if(href_list["show_preferences"])
|
|
client.prefs.ShowChoices(src)
|
|
return 1
|
|
|
|
if(href_list["ready"])
|
|
if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) // Make sure we don't ready up after the round has started
|
|
ready = text2num(href_list["ready"])
|
|
else
|
|
ready = 0
|
|
|
|
if(href_list["refresh"])
|
|
//src << browse(null, "window=playersetup") //closes the player setup window
|
|
panel.close()
|
|
new_player_panel_proc()
|
|
|
|
if(href_list["observe"])
|
|
|
|
if(alert(src,"Are you sure you wish to observe? You will have to wait 60 seconds before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit - Rykka corrected to 60 seconds to match current spawn time
|
|
if(!client) return 1
|
|
|
|
//Make a new mannequin quickly, and allow the observer to take the appearance
|
|
var/mob/living/carbon/human/dummy/mannequin = new()
|
|
client.prefs.dress_preview_mob(mannequin)
|
|
var/mob/observer/dead/observer = new(mannequin)
|
|
observer.moveToNullspace() //Let's not stay in our doomed mannequin
|
|
qdel(mannequin)
|
|
|
|
spawning = 1
|
|
if(client.media)
|
|
client.media.stop_music() // MAD JAMS cant last forever yo
|
|
|
|
observer.started_as_observer = 1
|
|
close_spawn_windows()
|
|
var/obj/O = locate("landmark*Observer-Start")
|
|
if(istype(O))
|
|
to_chat(src, "<span class='notice'>Now teleporting.</span>")
|
|
observer.forceMove(O.loc)
|
|
else
|
|
to_chat(src, "<span class='danger'>Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.</span>")
|
|
observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly.
|
|
|
|
announce_ghost_joinleave(src)
|
|
|
|
if(client.prefs.be_random_name)
|
|
client.prefs.real_name = random_name(client.prefs.identifying_gender)
|
|
observer.real_name = client.prefs.real_name
|
|
observer.name = observer.real_name
|
|
if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
|
|
observer.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
|
|
observer.key = key
|
|
qdel(src)
|
|
|
|
return 1
|
|
|
|
if(href_list["late_join"])
|
|
|
|
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
|
to_chat(usr, "<font color='red'>The round is either not ready, or has already finished...</font>")
|
|
return
|
|
/*
|
|
if(client.prefs.species != "Human" && !check_rights(R_ADMIN, 0)) //VORESTATION EDITS: THE COMMENTED OUT AREAS FROM LINE 154 TO 178
|
|
if (config.usealienwhitelist)
|
|
if(!is_alien_whitelisted(src, client.prefs.species))
|
|
alert(src, "You are currently not whitelisted to Play [client.prefs.species].")
|
|
return 0
|
|
*/
|
|
LateChoices()
|
|
|
|
if(href_list["manifest"])
|
|
ViewManifest()
|
|
|
|
if(href_list["SelectedJob"])
|
|
|
|
/* Vorestation Removal Start
|
|
//Prevents people rejoining as same character.
|
|
for (var/mob/living/carbon/human/C in mob_list)
|
|
var/char_name = client.prefs.real_name
|
|
if(char_name == C.real_name)
|
|
to_chat(usr, "<span class='notice'>There is a character that already exists with the same name - <b>[C.real_name]</b>, please join with a different one, or use Quit the Round with the previous character.</span>") //VOREStation Edit
|
|
return
|
|
*/ //Vorestation Removal End
|
|
|
|
if(!config.enter_allowed)
|
|
to_chat(usr, "<span class='notice'>There is an administrative lock on entering the game!</span>")
|
|
return
|
|
else if(ticker && ticker.mode && ticker.mode.explosion_in_progress)
|
|
to_chat(usr, "<span class='danger'>The station is currently exploding. Joining would go poorly.</span>")
|
|
return
|
|
|
|
if(!is_alien_whitelisted(src, GLOB.all_species[client.prefs.species]))
|
|
alert(src, "You are currently not whitelisted to play [client.prefs.species].")
|
|
return 0
|
|
|
|
var/datum/species/S = GLOB.all_species[client.prefs.species]
|
|
|
|
if(!(S.spawn_flags & SPECIES_CAN_JOIN))
|
|
alert(src,"Your current species, [client.prefs.species], is not available for play on the station.")
|
|
return 0
|
|
|
|
AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
|
|
return
|
|
|
|
if(href_list["privacy_poll"])
|
|
establish_db_connection()
|
|
if(!dbcon.IsConnected())
|
|
return
|
|
var/voted = 0
|
|
|
|
//First check if the person has not voted yet.
|
|
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'")
|
|
query.Execute()
|
|
while(query.NextRow())
|
|
voted = 1
|
|
break
|
|
|
|
//This is a safety switch, so only valid options pass through
|
|
var/option = "UNKNOWN"
|
|
switch(href_list["privacy_poll"])
|
|
if("signed")
|
|
option = "SIGNED"
|
|
if("anonymous")
|
|
option = "ANONYMOUS"
|
|
if("nostats")
|
|
option = "NOSTATS"
|
|
if("later")
|
|
usr << browse(null,"window=privacypoll")
|
|
return
|
|
if("abstain")
|
|
option = "ABSTAIN"
|
|
|
|
if(option == "UNKNOWN")
|
|
return
|
|
|
|
if(!voted)
|
|
var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')"
|
|
var/DBQuery/query_insert = dbcon.NewQuery(sql)
|
|
query_insert.Execute()
|
|
to_chat(usr, "<b>Thank you for your vote!</b>")
|
|
usr << browse(null,"window=privacypoll")
|
|
|
|
if(!ready && href_list["preference"])
|
|
if(client)
|
|
client.prefs.process_link(src, href_list)
|
|
else if(!href_list["late_join"])
|
|
new_player_panel()
|
|
|
|
if(href_list["showpoll"])
|
|
|
|
handle_player_polling()
|
|
return
|
|
|
|
if(href_list["pollid"])
|
|
|
|
var/pollid = href_list["pollid"]
|
|
if(istext(pollid))
|
|
pollid = text2num(pollid)
|
|
if(isnum(pollid))
|
|
src.poll_player(pollid)
|
|
return
|
|
|
|
if(href_list["votepollid"] && href_list["votetype"])
|
|
var/pollid = text2num(href_list["votepollid"])
|
|
var/votetype = href_list["votetype"]
|
|
switch(votetype)
|
|
if("OPTION")
|
|
var/optionid = text2num(href_list["voteoptionid"])
|
|
vote_on_poll(pollid, optionid)
|
|
if("TEXT")
|
|
var/replytext = href_list["replytext"]
|
|
log_text_poll_reply(pollid, replytext)
|
|
if("NUMVAL")
|
|
var/id_min = text2num(href_list["minid"])
|
|
var/id_max = text2num(href_list["maxid"])
|
|
|
|
if( (id_max - id_min) > 100 ) //Basic exploit prevention
|
|
to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
|
|
return
|
|
|
|
for(var/optionid = id_min; optionid <= id_max; optionid++)
|
|
if(!isnull(href_list["o[optionid]"])) //Test if this optionid was replied to
|
|
var/rating
|
|
if(href_list["o[optionid]"] == "abstain")
|
|
rating = null
|
|
else
|
|
rating = text2num(href_list["o[optionid]"])
|
|
if(!isnum(rating))
|
|
return
|
|
|
|
vote_on_numval_poll(pollid, optionid, rating)
|
|
if("MULTICHOICE")
|
|
var/id_min = text2num(href_list["minoptionid"])
|
|
var/id_max = text2num(href_list["maxoptionid"])
|
|
|
|
if( (id_max - id_min) > 100 ) //Basic exploit prevention
|
|
to_chat(usr, "The option ID difference is too big. Please contact administration or the database admin.")
|
|
return
|
|
|
|
for(var/optionid = id_min; optionid <= id_max; optionid++)
|
|
if(!isnull(href_list["option_[optionid]"])) //Test if this optionid was selected
|
|
vote_on_poll(pollid, optionid, 1)
|
|
|
|
if(href_list["shownews"])
|
|
handle_server_news()
|
|
return
|
|
|
|
if(href_list["hidden_jobs"])
|
|
show_hidden_jobs = !show_hidden_jobs
|
|
LateChoices()
|
|
|
|
if(href_list["give_feedback"])
|
|
if(!SSsqlite.can_submit_feedback(my_client))
|
|
return
|
|
|
|
if(client.feedback_form)
|
|
client.feedback_form.display() // In case they closed the form early.
|
|
else
|
|
client.feedback_form = new(client)
|
|
|
|
/mob/new_player/proc/handle_server_news()
|
|
if(!client)
|
|
return
|
|
var/savefile/F = get_server_news()
|
|
if(F)
|
|
client.prefs.lastnews = md5(F["body"])
|
|
SScharacter_setup.queue_preferences_save(client.prefs)
|
|
|
|
var/dat = "<html><body><center>"
|
|
dat += "<h1>[F["title"]]</h1>"
|
|
dat += "<br>"
|
|
dat += "[F["body"]]"
|
|
dat += "<br>"
|
|
dat += "<font size='2'><i>Last written by [F["author"]], on [F["timestamp"]].</i></font>"
|
|
dat += "</center></body></html>"
|
|
var/datum/browser/popup = new(src, "Server News", "Server News", 450, 300, src)
|
|
popup.set_content(dat)
|
|
popup.open()
|
|
|
|
|
|
/mob/new_player/proc/IsJobAvailable(rank)
|
|
var/datum/job/job = job_master.GetJob(rank)
|
|
if(!job) return 0
|
|
if(!job.is_position_available()) return 0
|
|
if(jobban_isbanned(src,rank)) return 0
|
|
if(!job.player_old_enough(src.client)) return 0
|
|
//VOREStation Add
|
|
if(!job.player_has_enough_playtime(src.client)) return 0
|
|
if(!is_job_whitelisted(src,rank)) return 0
|
|
if(!job.player_has_enough_pto(src.client)) return 0
|
|
//VOREStation Add End
|
|
return 1
|
|
|
|
|
|
/mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at)
|
|
if (src != usr)
|
|
return 0
|
|
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
|
to_chat(usr, "<font color='red'>The round is either not ready, or has already finished...</font>")
|
|
return 0
|
|
if(!config.enter_allowed)
|
|
to_chat(usr, "<span class='notice'>There is an administrative lock on entering the game!</span>")
|
|
return 0
|
|
if(!IsJobAvailable(rank))
|
|
alert(src,"[rank] is not available. Please try another.")
|
|
return 0
|
|
if(!spawn_checks_vr(rank)) return 0 // VOREStation Insert
|
|
if(!client)
|
|
return 0
|
|
|
|
//Find our spawning point.
|
|
var/list/join_props = job_master.LateSpawn(client, rank)
|
|
|
|
if(!join_props)
|
|
return
|
|
|
|
var/turf/T = join_props["turf"]
|
|
var/join_message = join_props["msg"]
|
|
var/announce_channel = join_props["channel"] || "Common"
|
|
|
|
if(!T || !join_message)
|
|
return 0
|
|
|
|
spawning = 1
|
|
close_spawn_windows()
|
|
|
|
job_master.AssignRole(src, rank, 1)
|
|
|
|
var/mob/living/character = create_character(T) //creates the human and transfers vars and mind
|
|
character = job_master.EquipRank(character, rank, 1) //equips the human
|
|
UpdateFactionList(character)
|
|
|
|
var/datum/job/J = SSjob.get_job(rank)
|
|
|
|
// AIs don't need a spawnpoint, they must spawn at an empty core
|
|
if(J.mob_type & JOB_SILICON_AI)
|
|
|
|
// IsJobAvailable for AI checks that there is an empty core available in this list
|
|
var/obj/structure/AIcore/deactivated/C = empty_playable_ai_cores[1]
|
|
empty_playable_ai_cores -= C
|
|
|
|
character.loc = C.loc
|
|
|
|
// AIize the character, but don't move them yet
|
|
character = character.AIize(move = FALSE) // Dupe of code in /datum/controller/subsystem/ticker/proc/create_characters() for non-latespawn, unify?
|
|
|
|
AnnounceCyborg(character, rank, "has been transferred to the empty core in \the [character.loc.loc]")
|
|
ticker.mode.latespawn(character)
|
|
|
|
qdel(C) //Deletes empty core (really?)
|
|
qdel(src) //Deletes new_player
|
|
return
|
|
|
|
// Equip our custom items only AFTER deploying to spawn points eh?
|
|
//equip_custom_items(character) //VOREStation Removal
|
|
|
|
//character.apply_traits() //VOREStation Removal
|
|
|
|
// Moving wheelchair if they have one
|
|
if(character.buckled && istype(character.buckled, /obj/structure/bed/chair/wheelchair))
|
|
character.buckled.loc = character.loc
|
|
character.buckled.set_dir(character.dir)
|
|
|
|
ticker.mode.latespawn(character)
|
|
|
|
if(J.mob_type & JOB_SILICON)
|
|
AnnounceCyborg(character, rank, join_message, announce_channel, character.z)
|
|
else
|
|
AnnounceArrival(character, rank, join_message, announce_channel, character.z)
|
|
data_core.manifest_inject(character)
|
|
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
|
|
|
qdel(src) // Delete new_player mob
|
|
|
|
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel)
|
|
if (ticker.current_state == GAME_STATE_PLAYING)
|
|
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE) : null
|
|
if(character.mind.role_alt_title)
|
|
rank = character.mind.role_alt_title
|
|
// can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc.
|
|
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer", channel, zlevels)
|
|
|
|
/mob/new_player/proc/LateChoices()
|
|
var/name = client.prefs.be_random_name ? "friend" : client.prefs.real_name
|
|
|
|
var/dat = "<html><body><center>"
|
|
dat += "<b>Welcome, [name].<br></b>"
|
|
dat += "Round Duration: [roundduration2text()]<br>"
|
|
|
|
if(emergency_shuttle) //In case NanoTrasen decides reposess CentCom's shuttles.
|
|
if(emergency_shuttle.going_to_centcom()) //Shuttle is going to CentCom, not recalled
|
|
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
|
|
if(emergency_shuttle.online())
|
|
if (emergency_shuttle.evac) // Emergency shuttle is past the point of no recall
|
|
dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>"
|
|
else // Crew transfer initiated
|
|
dat += "<font color='red'>The station is currently undergoing crew transfer procedures.</font><br>"
|
|
|
|
dat += "Choose from the following open/valid positions:<br>"
|
|
dat += "<a href='byond://?src=\ref[src];hidden_jobs=1'>[show_hidden_jobs ? "Hide":"Show"] Hidden Jobs.</a><br>"
|
|
|
|
var/deferred = ""
|
|
for(var/datum/job/job in job_master.occupations)
|
|
if(job && IsJobAvailable(job.title))
|
|
// Checks for jobs with minimum age requirements
|
|
if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age))
|
|
continue
|
|
// Checks for jobs set to "Never" in preferences //TODO: Figure out a better way to check for this
|
|
if(!(client.prefs.GetJobDepartment(job, 1) & job.flag))
|
|
if(!(client.prefs.GetJobDepartment(job, 2) & job.flag))
|
|
if(!(client.prefs.GetJobDepartment(job, 3) & job.flag))
|
|
if(!show_hidden_jobs && job.title != "Assistant") // Assistant is always an option
|
|
continue
|
|
var/active = 0
|
|
// Only players with the job assigned and AFK for less than 10 minutes count as active
|
|
for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 MINUTES)
|
|
active++
|
|
|
|
var/string = "<a href='byond://?src=\ref[src];SelectedJob=[job.title]'>[job.title] ([job.current_positions]) (Active: [active])</a><br>"
|
|
|
|
if(job.offmap_spawn) //At the bottom
|
|
deferred += string
|
|
else
|
|
dat += string
|
|
|
|
dat += deferred
|
|
|
|
dat += "</center>"
|
|
src << browse(dat, "window=latechoices;size=300x640;can_close=1")
|
|
|
|
|
|
/mob/new_player/proc/create_character(var/turf/T)
|
|
spawning = 1
|
|
close_spawn_windows()
|
|
|
|
var/mob/living/carbon/human/new_character
|
|
|
|
var/use_species_name
|
|
var/datum/species/chosen_species
|
|
if(client.prefs.species)
|
|
chosen_species = GLOB.all_species[client.prefs.species]
|
|
use_species_name = chosen_species.get_station_variant() //Only used by pariahs atm.
|
|
|
|
if(chosen_species && use_species_name)
|
|
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
|
if(is_alien_whitelisted(chosen_species))
|
|
new_character = new(T, use_species_name)
|
|
|
|
if(!new_character)
|
|
new_character = new(T)
|
|
|
|
if(ticker.random_players)
|
|
new_character.gender = pick(MALE, FEMALE)
|
|
client.prefs.real_name = random_name(new_character.gender)
|
|
client.prefs.randomize_appearance_and_body_for(new_character)
|
|
else
|
|
client.prefs.copy_to(new_character, icon_updates = TRUE)
|
|
|
|
if(client && client.media)
|
|
client.media.stop_music() // MAD JAMS cant last forever yo
|
|
|
|
if(mind)
|
|
mind.active = 0 //we wish to transfer the key manually
|
|
// VOREStation edit to disable the destructive forced renaming for our responsible whitelist clowns.
|
|
//if(mind.assigned_role == "Clown") //give them a clownname if they are a clown
|
|
// new_character.real_name = pick(clown_names) //I hate this being here of all places but unfortunately dna is based on real_name!
|
|
// new_character.rename_self("clown")
|
|
mind.original = new_character
|
|
// VOREStation
|
|
mind.loaded_from_ckey = client.ckey
|
|
mind.loaded_from_slot = client.prefs.default_slot
|
|
// VOREStation
|
|
//mind.traits = client.prefs.traits.Copy() // VOREStation conflict
|
|
mind.transfer_to(new_character) //won't transfer key since the mind is not active
|
|
|
|
new_character.name = real_name
|
|
new_character.dna.ready_dna(new_character)
|
|
new_character.dna.b_type = client.prefs.b_type
|
|
new_character.sync_organ_dna()
|
|
if(client.prefs.disabilities)
|
|
// Set defer to 1 if you add more crap here so it only recalculates struc_enzymes once. - N3X
|
|
new_character.dna.SetSEState(GLASSESBLOCK,1,0)
|
|
new_character.disabilities |= NEARSIGHTED
|
|
|
|
for(var/lang in client.prefs.alternate_languages)
|
|
var/datum/language/chosen_language = GLOB.all_languages[lang]
|
|
if(chosen_language)
|
|
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
|
|
new_character.add_language(lang)
|
|
// And uncomment this, too.
|
|
//new_character.dna.UpdateSE()
|
|
|
|
// Do the initial caching of the player's body icons.
|
|
new_character.force_update_limbs()
|
|
new_character.update_icons_body()
|
|
new_character.update_eyes()
|
|
|
|
new_character.key = key //Manually transfer the key to log them in
|
|
|
|
return new_character
|
|
|
|
/mob/new_player/proc/ViewManifest()
|
|
var/dat = "<div align='center'>"
|
|
dat += data_core.get_manifest(OOC = 1)
|
|
|
|
//src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
|
var/datum/browser/popup = new(src, "Crew Manifest", "Crew Manifest", 370, 420, src)
|
|
popup.set_content(dat)
|
|
popup.open()
|
|
|
|
/mob/new_player/Move()
|
|
return 0
|
|
|
|
/mob/new_player/proc/close_spawn_windows()
|
|
|
|
src << browse(null, "window=latechoices") //closes late choices window
|
|
src << browse(null, "window=preferences_window") //closes the player setup window
|
|
panel.close()
|
|
|
|
/mob/new_player/proc/has_admin_rights()
|
|
return check_rights(R_ADMIN, 0, src)
|
|
|
|
/mob/new_player/get_species()
|
|
var/datum/species/chosen_species
|
|
if(client.prefs.species)
|
|
chosen_species = GLOB.all_species[client.prefs.species]
|
|
|
|
if(!chosen_species)
|
|
return SPECIES_HUMAN
|
|
|
|
if(is_alien_whitelisted(chosen_species))
|
|
return chosen_species.name
|
|
|
|
return SPECIES_HUMAN
|
|
|
|
/mob/new_player/get_gender()
|
|
if(!client || !client.prefs) ..()
|
|
return client.prefs.biological_gender
|
|
|
|
/mob/new_player/is_ready()
|
|
return ready && ..()
|
|
|
|
// Prevents lobby players from seeing say, even with ghostears
|
|
/mob/new_player/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null)
|
|
return
|
|
|
|
/mob/new_player/hear_holopad_talk(list/message_pieces, var/verb = "says", var/mob/speaker = null)
|
|
return
|
|
|
|
/mob/new_player/hear_holopad_talk(list/message_pieces, var/verb = "says", var/mob/speaker = null)
|
|
return
|
|
|
|
// Prevents lobby players from seeing emotes, even with ghosteyes
|
|
/mob/new_player/show_message(msg, type, alt, alt_type)
|
|
return
|
|
|
|
/mob/new_player/hear_radio()
|
|
return
|
|
|
|
/mob/new_player/MayRespawn()
|
|
return 1
|