/
githubmirror
/
vgstation13
Обзор
Документация
Войти
/
githubmirror
/
vgstation13
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
Bleeding-Edge
code/modules/admin/player_panel.dm
405 строк
11 KB
ShiftyRail
Fixes player panel search tool displaying empty rows (#37531)
06 май 2025, 16:01
Не верифицирован
06 май 2025, 16:01
12fd65f
Код
Авторство
О чём код?
/mob/proc/player_panel_job() //returns the job/ return "Mob" /mob/living/player_panel_job() return "Living" /mob/living/carbon/player_panel_job() return "Carbon-Based" /mob/living/carbon/human/player_panel_job() return job /mob/living/carbon/slime/player_panel_job() return "Slime" /mob/living/carbon/monkey/player_panel_job() return "Monkey" /mob/living/carbon/monkey/diona/player_panel_job() return "Diona Nymph" /mob/living/carbon/alien/player_panel_job() return "Alien" /mob/living/carbon/alien/larva/player_panel_job() return "Alien Larva" /mob/living/simple_animal/player_panel_job() return "Animal" /mob/living/simple_animal/borer/player_panel_job() return "Borer" /mob/living/simple_animal/corgi/player_panel_job() return "Corgi" /mob/living/simple_animal/construct/player_panel_job() return "Construct" /mob/living/silicon/player_panel_job() return "Silicon" /mob/living/silicon/robot/player_panel_job() return "Cyborg" /mob/living/silicon/robot/mommi/player_panel_job() return "Mobile-MMI" /mob/living/silicon/ai/player_panel_job() return "AI" /mob/living/silicon/pai/player_panel_job() return "pAI" /mob/dead/observer/player_panel_job() return "Ghost" /mob/new_player/player_panel_job() return "New Player" /datum/admins/proc/player_panel_new()//The new one if (!usr.client.holder) return var/dat = "<html><head><title>Admin Player Panel</title></head>" //javascript, the part that does most of the work~ dat += {" <head> <script type='text/javascript'> var locked_tabs = new Array(); function updateSearch(){ var filter_text = document.getElementById('filter'); var filter = filter_text.value.toLowerCase(); if(complete_list != null && complete_list != "") { var mtbl = document.getElementById("maintable_data_archive"); mtbl.innerHTML = complete_list; } if(filter.value == "") { return; }else{ var maintable_data = document.getElementById('maintable_data'); var ltr = maintable_data.getElementsByTagName("tr"); for ( var i = 0; i < ltr.length; ++i ) { try{ var tr = ltr\[i\]; if(tr.getAttribute("id").indexOf("data") != 0) { continue; } var ltd = tr.getElementsByTagName("td"); var td = ltd\[0\]; var lsearch = td.getElementsByTagName("b"); var search = lsearch\[0\]; //var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element. //document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter)) if ( search.innerText.toLowerCase().indexOf(filter) == -1 ) { //document.write("a"); tr.parentNode.removeChild(tr); td.innerHTML = ""; i--; } }catch(err) { } } } var count = 0; var index = -1; var debug = document.getElementById("debug"); locked_tabs = new Array(); } function expand(id,job,name,real_name,image,key,ip,antagonist,ref){ clearAll(); var span = document.getElementById(id); body = "<table><tr><td>"; body += "</td><td align='center'>"; body += "<font size='2'><b>"+job+" "+name+"</b><br><b>Real name "+real_name+"</b><br><b>Played by "+key+" ("+ip+")</b></font>" body += "</td><td align='center'>"; body += "<a href='?src=\ref[src];adminplayeropts="+ref+"'>PP</a> - " body += "<a href='?src=\ref[src];notes=show;mob="+ref+"'>N</a> - " body += "<a href='?_src_=vars;Vars="+ref+"'>VV</a> - " body += "<a href='?src=\ref[src];traitor="+ref+"'>RP</a> - " body += "<a href='?src=\ref[usr];priv_msg=\ref"+ref+"'>PM</a> - " body += "<a href='?src=\ref[src];subtlemessage="+ref+"'>SM</a> - " body += "<a href='?src=\ref[src];adminplayerobservejump="+ref+"'>JMP</a><br>" if(antagonist > 0) body += "<font size='2'><a href='?src=\ref[src];check_antagonist=1'><font color='red'><b>Antagonist</b></font></a></font>"; body += "</td></tr></table>"; span.innerHTML = body } function clearAll(){ var spans = document.getElementsByTagName('span'); for(var i = 0; i < spans.length; i++){ var span = spans\[i\]; var id = span.getAttribute("id"); if(!(id.indexOf("item")==0)) continue; var pass = 1; for(var j = 0; j < locked_tabs.length; j++){ if(locked_tabs\[j\]==id) { pass = 0; break; } } if(pass != 1) continue; span.innerHTML = ""; } } function addToLocked(id,link_id,notice_span_id){ var link = document.getElementById(link_id); var decision = link.getAttribute("name"); if(decision == "1") { link.setAttribute("name","2"); }else{ link.setAttribute("name","1"); removeFromLocked(id,link_id,notice_span_id); return; } var pass = 1; for(var j = 0; j < locked_tabs.length; j++){ if(locked_tabs\[j\]==id) { pass = 0; break; } } if(!pass) return; locked_tabs.push(id); var notice_span = document.getElementById(notice_span_id); notice_span.innerHTML = "<font color='red'>Locked</font> "; //link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');"); //document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')"); //document.write("aa - "+link.getAttribute("onClick")); } function attempt(ab){ return ab; } function removeFromLocked(id,link_id,notice_span_id){ //document.write("a"); var index = 0; var pass = 0; for(var j = 0; j < locked_tabs.length; j++){ if(locked_tabs\[j\]==id) { pass = 1; index = j; break; } } if(!pass) return; locked_tabs\[index\] = ""; var notice_span = document.getElementById(notice_span_id); notice_span.innerHTML = ""; //var link = document.getElementById(link_id); //link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')"); } function selectTextField(){ var filter_text = document.getElementById('filter'); filter_text.focus(); filter_text.select(); } </script> </head> "} //body tag start + onload and onkeypress (onkeyup) javascript event calls dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>" //title + search bar dat += {" <table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'> <tr id='title_tr'> <td align='center'> <font size='5'><b>Player panel</b></font><br> Hover over a line to see more information - <a href='?src=\ref[src];check_antagonist=1'>Check antagonists</a> <p> </td> </tr> <tr id='search_tr'> <td align='center'> <b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'> </td> </tr> </table> "} //player table header dat += {" <span id='maintable_data_archive'> <table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"} var/list/mobs = sortmobs() var/i = 1 for(var/mob/M in mobs) if(M.ckey) var/color = "#e6e6e6" if(i%2 == 0) color = "#f2f2f2" var/is_antagonist = is_special_character(M) var/M_job = M.player_panel_job() M_job = replacetext(M_job, "'", "") M_job = replacetext(M_job, "\"", "") M_job = replacetext(M_job, "\\", "") var/M_name = M.name M_name = replacetext(M_name, "'", "") M_name = replacetext(M_name, "\"", "") M_name = replacetext(M_name, "\\", "") var/M_rname = M.real_name M_rname = replacetext(M_rname, "'", "") M_rname = replacetext(M_rname, "\"", "") M_rname = replacetext(M_rname, "\\", "") var/M_key = M.key M_key = replacetext(M_key, "'", "") M_key = replacetext(M_key, "\"", "") M_key = replacetext(M_key, "\\", "") //output for each mob dat += {" <tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')"> <td align='center' bgcolor='[color]'> <span id='notice_span[i]'></span> <a id='link[i]' onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]",[is_antagonist],"\ref[M]")' > <b id='search[i]'>[M_name] - [M_rname] - [M_key] ([M_job])</b> </a> <br><span id='item[i]'></span> </td> </tr> "} i++ //player table ending dat += {" </table> </span> <script type='text/javascript'> var maintable = document.getElementById("maintable_data_archive"); var complete_list = maintable.innerHTML; </script> </body></html> "} usr << browse(HTML_SKELETON(dat), "window=players;size=600x480") //The old one /datum/admins/proc/player_panel_old() if (!usr.client.holder) return var/dat = {"<html><head><title>Player Menu</title></head> <body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th><th>Traitor?</th></tr></B>"} //add <th>IP:</th> to this if wanting to add back in IP checking //add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below var/list/mobs = sortmobs() for(var/mob/M in mobs) if(!M.ckey) continue dat += "<tr><td>[M.name]</td>" if(isAI(M)) dat += "<td>AI</td>" else if(isrobot(M)) dat += "<td>Cyborg</td>" else if(ishuman(M)) dat += "<td>[M.real_name]</td>" else if(istype(M, /mob/living/silicon/pai)) dat += "<td>pAI</td>" else if(istype(M, /mob/new_player)) dat += "<td>New Player</td>" else if(isobserver(M)) dat += "<td>Ghost</td>" else if(ismonkey(M)) dat += "<td>Monkey</td>" else if(isalien(M)) dat += "<td>Alien</td>" else if(isborer(M)) dat += "<td>Borer</td>" else dat += "<td>Unknown</td>" if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.mind && H.mind.assigned_role) dat += "<td>[H.mind.assigned_role]</td>" else dat += "<td>NA</td>" dat += {"<td>[(M.client ? "[M.client]" : "No client")]</td> <td align=center><A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>X</A></td> <td align=center><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td> "} switch(is_special_character(M)) if(0) dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'>Traitor?</A></td>"} if(1) dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red>Traitor?</font></A></td>"} if(2) dat += {"<td align=center><A HREF='?src=\ref[src];traitor=\ref[M]'><font color=red><b>Traitor?</b></font></A></td>"} dat += "</table></body></html>" usr << browse(dat, "window=players;size=640x480")