From 84379860b6302de2340e5efff9dfbcbe42e68f1b Mon Sep 17 00:00:00 2001 From: craftxbox Date: Wed, 26 Jun 2019 14:22:58 -0230 Subject: [PATCH 001/111] a cardinal sin amongst men: using webeditor. --- goon/browserassets/js/browserOutput.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 03eabaffeef..8239261b904 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -41,6 +41,7 @@ var opts = { 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu 'highlightTerms': [], 'highlightLimit': 5, + 'highlightEscapeRegex':true, 'highlightColor': '#FFFF00', //The color of the highlighted message 'pingDisabled': false, //Has the user disabled the ping counter @@ -159,7 +160,7 @@ function setHighlightColor(match) { function highlightTerms(el) { for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term if(opts.highlightTerms[i]) { - var rexp = new RegExp("("+opts.highlightTerms[i]+")","gmi") + var rexp = new RegExp("("+opts.highlightEscapeRegex?opts.highlightTerms[i].replace(new RegExp("([^a-zA-Z0-9])","gmi"),"\\$1"):opts.highlightTerms[i]+")","gmi") el.innerHTML = el.innerHTML.replace(rexp,"$1") } } @@ -606,6 +607,10 @@ $(function() { opts.highlightColor = savedConfig.shighlightColor; internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); } + if (savedConfig.shighlightEscapeRegex) { + opts.highlightEscapeRegex = savedConfig.shighlightEscapeRegex; + internalOutput('Loaded highlight regex enable of: '+savedConfig.shighlightEscapeRegex+'', 'internal'); + } if (savedConfig.shideSpam) { opts.hideSpam = $.parseJSON(savedConfig.shideSpam); internalOutput('Loaded hide spam preference of: ' + savedConfig.shideSpam + '', 'internal'); @@ -969,7 +974,9 @@ $(function() { } var popupContent = '
String Highlighting
' + '
' + - '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
Regex compatible
See here for details
' + + '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
'+ + 'Regex Enabled'+ + '
See here for details
' + '
' + termInputs + '
Date: Wed, 26 Jun 2019 22:42:35 -0230 Subject: [PATCH 002/111] regex enable/disable checkbox --- goon/browserassets/js/browserOutput.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 8239261b904..8d8e20d25e5 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -160,7 +160,10 @@ function setHighlightColor(match) { function highlightTerms(el) { for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term if(opts.highlightTerms[i]) { - var rexp = new RegExp("("+opts.highlightEscapeRegex?opts.highlightTerms[i].replace(new RegExp("([^a-zA-Z0-9])","gmi"),"\\$1"):opts.highlightTerms[i]+")","gmi") + var rexp = new RegExp("("+opts.highlightTerms[i]+")","gmi") + if(opts.highlightEscapeRegex){ + rexp = new RegExp("("+opts.highlightTerms[i].replace(new RegExp("([^a-zA-Z0-9])","gmi"),"\\$1")+")","gmi") + } el.innerHTML = el.innerHTML.replace(rexp,"$1") } } @@ -570,6 +573,7 @@ $(function() { 'spingDisabled': getCookie('pingdisabled'), 'shighlightTerms': getCookie('highlightterms'), 'shighlightColor': getCookie('highlightcolor'), + 'shighlightEscapeRegex': getCookie('highlightescaperegex'), 'shideSpam': getCookie('hidespam'), 'darkChat': getCookie('darkChat'), }; @@ -975,7 +979,7 @@ $(function() { var popupContent = '
String Highlighting
' + '
' + '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
'+ - 'Regex Enabled'+ + 'Regex Enabled'+ '
See here for details
' + '' + termInputs + @@ -986,7 +990,6 @@ $(function() { '
'; createPopup(popupContent, 250); }); - $('body').on('keyup', '#highlightColor', function() { var color = $('#highlightColor').val(); color = color.trim(); @@ -1014,7 +1017,7 @@ $(function() { } var color = $('#highlightColor').val(); - opts.highlightEnableRegex = !($('#highlightRegexEnable').checked) + opts.highlightEscapeRegex = !(document.getElementById('highlightregexenable').checked) color = color.trim(); if (color == '' || color.charAt(0) != '#') { opts.highlightColor = '#FFFF00'; @@ -1024,6 +1027,7 @@ $(function() { var $popup = $('#highlightPopup').closest('.popup'); $popup.remove(); + setCookie('highlightescaperegex', opts.highlightEscapeRegex,365) setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365); setCookie('highlightcolor', opts.highlightColor, 365); }); From 4ccebc413371df189a8d3a4561d8fc1dc312df3a Mon Sep 17 00:00:00 2001 From: craftxbox Date: Thu, 15 Aug 2019 19:46:02 -0230 Subject: [PATCH 003/111] h --- goon/browserassets/js/browserOutput.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 8d8e20d25e5..962809eae68 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -41,7 +41,7 @@ var opts = { 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu 'highlightTerms': [], 'highlightLimit': 5, - 'highlightEscapeRegex':true, + 'highlightRegexEnable':false, 'highlightColor': '#FFFF00', //The color of the highlighted message 'pingDisabled': false, //Has the user disabled the ping counter @@ -161,7 +161,7 @@ function highlightTerms(el) { for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term if(opts.highlightTerms[i]) { var rexp = new RegExp("("+opts.highlightTerms[i]+")","gmi") - if(opts.highlightEscapeRegex){ + if(!opts.highlightRegexEnable){ rexp = new RegExp("("+opts.highlightTerms[i].replace(new RegExp("([^a-zA-Z0-9])","gmi"),"\\$1")+")","gmi") } el.innerHTML = el.innerHTML.replace(rexp,"$1") @@ -573,7 +573,7 @@ $(function() { 'spingDisabled': getCookie('pingdisabled'), 'shighlightTerms': getCookie('highlightterms'), 'shighlightColor': getCookie('highlightcolor'), - 'shighlightEscapeRegex': getCookie('highlightescaperegex'), + 'shighlightRegexEnable': getCookie('highlightregexenable'), 'shideSpam': getCookie('hidespam'), 'darkChat': getCookie('darkChat'), }; @@ -611,9 +611,9 @@ $(function() { opts.highlightColor = savedConfig.shighlightColor; internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); } - if (savedConfig.shighlightEscapeRegex) { - opts.highlightEscapeRegex = savedConfig.shighlightEscapeRegex; - internalOutput('Loaded highlight regex enable of: '+savedConfig.shighlightEscapeRegex+'', 'internal'); + if (savedConfig.shighlightRegexEnable) { + opts.highlightRegexEnable = savedConfig.shighlightRegexEnable; + internalOutput('Loaded highlight regex enable of: '+savedConfig.shighlightRegexEnable+'', 'internal'); } if (savedConfig.shideSpam) { opts.hideSpam = $.parseJSON(savedConfig.shideSpam); @@ -979,7 +979,7 @@ $(function() { var popupContent = '
String Highlighting
' + '
' + '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
'+ - 'Regex Enabled'+ + 'Enable Regex'+ '
See here for details
' + '' + termInputs + @@ -989,6 +989,7 @@ $(function() { '' + '
'; createPopup(popupContent, 250); + document.querySelector(".popup #highlightRegexEnable").checked = opts.highlightRegexEnable; }); $('body').on('keyup', '#highlightColor', function() { var color = $('#highlightColor').val(); @@ -1017,7 +1018,7 @@ $(function() { } var color = $('#highlightColor').val(); - opts.highlightEscapeRegex = !(document.getElementById('highlightregexenable').checked) + opts.highlightRegexEnable = document.querySelector("#highlightRegexEnable").checked color = color.trim(); if (color == '' || color.charAt(0) != '#') { opts.highlightColor = '#FFFF00'; @@ -1027,7 +1028,7 @@ $(function() { var $popup = $('#highlightPopup').closest('.popup'); $popup.remove(); - setCookie('highlightescaperegex', opts.highlightEscapeRegex,365) + setCookie('highlightregexenable', opts.highlightRegexEnable,365) setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365); setCookie('highlightcolor', opts.highlightColor, 365); }); From ec2eeeff502609a537c385ed380f0d79a207c1c0 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 7 Oct 2019 20:54:43 -0230 Subject: [PATCH 004/111] lets try this again --- goon/browserassets/js/browserOutput.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 962809eae68..565a3535982 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -160,11 +160,13 @@ function setHighlightColor(match) { function highlightTerms(el) { for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term if(opts.highlightTerms[i]) { - var rexp = new RegExp("("+opts.highlightTerms[i]+")","gmi") + var rexp = new RegExp(opts.highlightTerms[i],"gmi") if(!opts.highlightRegexEnable){ rexp = new RegExp("("+opts.highlightTerms[i].replace(new RegExp("([^a-zA-Z0-9])","gmi"),"\\$1")+")","gmi") + el.innerText = el.innerText.replace(rexp,"$1") //disabling regex disables html matching too + continue; } - el.innerHTML = el.innerHTML.replace(rexp,"$1") + el.innerHTML = el.innerHTML.replace(rexp,"$0") //i cant figure out a proper, non snowflakey way to let people select the group that gets highlighted } } } From bf131ecdb283fafa4a20df176fb2c5af496cc5fd Mon Sep 17 00:00:00 2001 From: craftxbox Date: Sun, 27 Oct 2019 17:01:40 -0230 Subject: [PATCH 005/111] fix all the shit --- goon/browserassets/js/browserOutput.js | 33 ++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 565a3535982..f700d2ff028 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -72,6 +72,8 @@ var opts = { 'enableEmoji': true }; +var regexHasError = false; //variable to check if regex has excepted + function outerHTML(el) { var wrap = document.createElement('div'); wrap.appendChild(el.cloneNode(true)); @@ -91,6 +93,19 @@ if (typeof String.prototype.trim !== 'function') { }; } +//Polyfill for string.prototype.includes. Why the fuck. Just why the fuck. +if (!String.prototype.includes) { + String.prototype.includes = function(search, start) { + 'use strict'; + + if (search instanceof RegExp) { + throw TypeError('first argument must not be a RegExp'); + } + if (start === undefined) { start = 0; } + return this.indexOf(search, start) !== -1; + }; +} + //Shit fucking piece of crap that doesn't work god fuckin damn it function linkify(text) { var rex = /((?:$1") //disabling regex disables html matching too + if(el.innerText.toString().toLowerCase().includes(opts.highlightTerms[i].toLowerCase())) //match normally + el.innerHTML = ''+el.innerHTML+'' //encloseincludes continue; } + var rexp; + try{ + rexp = new RegExp(opts.highlightTerms[i],"gmi") + } catch(e){ + el.innerHTML+='
Your highlight regex - '+opts.highlightTerms[i]+' - is malformed. Thrown exception: '+e+'' + regexHasError = true; + return; + } el.innerHTML = el.innerHTML.replace(rexp,"$0") //i cant figure out a proper, non snowflakey way to let people select the group that gets highlighted } } @@ -575,7 +598,7 @@ $(function() { 'spingDisabled': getCookie('pingdisabled'), 'shighlightTerms': getCookie('highlightterms'), 'shighlightColor': getCookie('highlightcolor'), - 'shighlightRegexEnable': getCookie('highlightregexenable'), + 'shighlightRegexEnable': getCookie('highlightregexenable') == "true", 'shideSpam': getCookie('hidespam'), 'darkChat': getCookie('darkChat'), }; @@ -1027,6 +1050,8 @@ $(function() { } else { opts.highlightColor = color; } + regexHasError = false; //they changed the regex so it might be valid now + var $popup = $('#highlightPopup').closest('.popup'); $popup.remove(); From 2d97f55b16561e93a0b07ff78f571970d0c385aa Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 4 Nov 2019 00:30:09 -0330 Subject: [PATCH 006/111] my hatred for ie is immesurable --- goon/browserassets/js/browserOutput.js | 64 +++++++++++++++++++++----- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 094e8258562..b94734040bb 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -171,25 +171,67 @@ function setHighlightColor(match) { match.style.background = opts.highlightColor } +function escapeRegex(input){ // put this in a function incase it ever needs to be used elsewhere, makes code cleaner + return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + //Highlights words based on user settings function highlightTerms(el) { if(regexHasError) return; //just stop right there ig the regex is gonna except + function highlightRecursor(element,term){ //recursor function to do the highlighting proper + var regex = new RegExp("("+term+")","gi") + function replace(str) { + return str.replace(regex,'$&') + } + var s='' + var work=element.innerHTML; + var work_lc=work.toLowerCase() + var ind=0; + while(ind < work_lc.length) { + console.log(s); + var next_term=work_lc.substring(ind).search(regex); + if(next_term!=-1)next_term+=ind; + var next_tag =work_lc.indexOf('<',ind) + if(next_tag == -1) { + s+=replace(work.substring(ind)); + break; + } + else if(next_term==-1) { + s+=work.substring(ind) + break; + } + else if(next_tag < next_term) { + var temp=work_lc.indexOf('>',next_tag) + s+=work.substring(ind,temp+1); + ind=temp+1; + } + else { + s+=replace(work.substring(ind,next_tag)); + ind=next_tag + } + } + + element.innerHTML=s; + } + for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term if(opts.highlightTerms[i]) { if(!opts.highlightRegexEnable){ - if(el.innerText.toString().toLowerCase().includes(opts.highlightTerms[i].toLowerCase())) //match normally - el.innerHTML = ''+el.innerHTML+'' //encloseincludes - continue; + var innerTerms = opts.highlightTerms[i].split(" ") + for(var a in innerTerms){ + highlightRecursor(el,escapeRegex(innerTerms[a])) + } } - var rexp; - try{ - rexp = new RegExp(opts.highlightTerms[i],"gmi") - } catch(e){ - el.innerHTML+='
Your highlight regex - '+opts.highlightTerms[i]+' - is malformed. Thrown exception: '+e+'' - regexHasError = true; - return; + else { + try{ + new RegExp(opts.highlightTerms[i],"gmi") // check to make sure the pattern wont cause issues + } catch(e){ + el.innerHTML+='
Your highlight regex pattern - '+opts.highlightTerms[i]+' - is malformed.
Your highlights have been disabled until they are next edited
Thrown exception: '+e+'
' + regexHasError = true; + return; + } + highlightRecursor(el,opts.highlightTerms[i]) } - el.innerHTML = el.innerHTML.replace(rexp,"$0") //i cant figure out a proper, non snowflakey way to let people select the group that gets highlighted } } } From 89b9508378c1224275c5b29eb9afb32dbc501c32 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 4 Nov 2019 18:16:41 -0330 Subject: [PATCH 007/111] remove the dumb bits and make the highlight color change retroactively upon change --- goon/browserassets/js/browserOutput.js | 45 ++++++++++++++++---------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index b94734040bb..9508f669bc3 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -166,9 +166,12 @@ function emojiparse(el) { } } -// Colorizes the highlight spans -function setHighlightColor(match) { - match.style.background = opts.highlightColor +// Recolorizes the highlight spans +function setHighlightColor() { + var highlightspans = document.getElementsByClassName("highlight") + for(var i in highlightspans){ + highlightspans[i].setAttribute("style","background-color:"+opts.highlightColor) + } } function escapeRegex(input){ // put this in a function incase it ever needs to be used elsewhere, makes code cleaner @@ -177,21 +180,25 @@ function escapeRegex(input){ // put this in a function incase it ever needs to b //Highlights words based on user settings function highlightTerms(el) { + if(regexHasError) return; //just stop right there ig the regex is gonna except + function highlightRecursor(element,term){ //recursor function to do the highlighting proper var regex = new RegExp("("+term+")","gi") + function replace(str) { - return str.replace(regex,'$&') + return str.replace(regex,'$&') } + var s='' var work=element.innerHTML; - var work_lc=work.toLowerCase() var ind=0; - while(ind < work_lc.length) { - console.log(s); - var next_term=work_lc.substring(ind).search(regex); - if(next_term!=-1)next_term+=ind; - var next_tag =work_lc.indexOf('<',ind) + + while(ind < work.length) { + + var next_term=work.substring(ind).search(regex); + if(next_term!=-1)next_term+=ind; + var next_tag =work.indexOf('<',ind) if(next_tag == -1) { s+=replace(work.substring(ind)); break; @@ -201,7 +208,7 @@ function highlightTerms(el) { break; } else if(next_tag < next_term) { - var temp=work_lc.indexOf('>',next_tag) + var temp=work.indexOf('>',next_tag) s+=work.substring(ind,temp+1); ind=temp+1; } @@ -1084,13 +1091,17 @@ $(function() { count++; } - var color = $('#highlightColor').val(); opts.highlightRegexEnable = document.querySelector("#highlightRegexEnable").checked - color = color.trim(); - if (color == '' || color.charAt(0) != '#') { - opts.highlightColor = '#FFFF00'; - } else { - opts.highlightColor = color; + + var color = $('#highlightColor').val(); + if(color != opts.highlightColor) { // did the color even change? + color = color.trim(); + if (color == '' || color.charAt(0) != '#') { + opts.highlightColor = '#FFFF00'; + } else { + opts.highlightColor = color; + } + setHighlightColor(); } regexHasError = false; //they changed the regex so it might be valid now From ea8472f038c681a204085ee1e404cfc85808ebea Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 4 Nov 2019 18:46:23 -0330 Subject: [PATCH 008/111] do the onedit pattern check simply --- goon/browserassets/js/browserOutput.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 9508f669bc3..3c266fc023e 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -1103,7 +1103,9 @@ $(function() { } setHighlightColor(); } + regexHasError = false; //they changed the regex so it might be valid now + internalOutput('Highlights have been updated.',"internal") // simplest way to test if pattern works, why reinvent the wheel? var $popup = $('#highlightPopup').closest('.popup'); $popup.remove(); From 964e23bb48a7fc9b98be724f6513946b8938e59b Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 13 Apr 2020 00:23:15 -0230 Subject: [PATCH 009/111] styling fixes --- goon/browserassets/js/browserOutput.js | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 3c266fc023e..d20d2eb239e 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -174,51 +174,51 @@ function setHighlightColor() { } } -function escapeRegex(input){ // put this in a function incase it ever needs to be used elsewhere, makes code cleaner +function escapeRegexCharacters(input){ //escapes any characters that could be interpreted as regex patterns, potentially causing patterns to break if not escaped return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } //Highlights words based on user settings function highlightTerms(el) { - if(regexHasError) return; //just stop right there ig the regex is gonna except + if (regexHasError) return; //just stop right there ig the regex is gonna except function highlightRecursor(element,term){ //recursor function to do the highlighting proper - var regex = new RegExp("("+term+")","gi") + var regex = new RegExp(term,"gi"); function replace(str) { - return str.replace(regex,'$&') + return str.replace(regex,'$&'); } - var s='' - var work=element.innerHTML; - var ind=0; + var s = ''; + var work = element.innerHTML; + var ind = 0; while(ind < work.length) { - var next_term=work.substring(ind).search(regex); - if(next_term!=-1)next_term+=ind; - var next_tag =work.indexOf('<',ind) + var next_term = work.substring(ind).search(regex); + if(next_term != -1) next_term += ind; + var next_tag = work.indexOf('<',ind); if(next_tag == -1) { s+=replace(work.substring(ind)); break; } else if(next_term==-1) { - s+=work.substring(ind) + s += work.substring(ind); break; } else if(next_tag < next_term) { - var temp=work.indexOf('>',next_tag) - s+=work.substring(ind,temp+1); - ind=temp+1; + var temp = work.indexOf('>',next_tag); + s += work.substring(ind,temp+1); + ind = temp+1; } else { - s+=replace(work.substring(ind,next_tag)); - ind=next_tag + s += replace(work.substring(ind,next_tag)); + ind = next_tag; } } - element.innerHTML=s; + element.innerHTML = s; } for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term @@ -226,18 +226,18 @@ function highlightTerms(el) { if(!opts.highlightRegexEnable){ var innerTerms = opts.highlightTerms[i].split(" ") for(var a in innerTerms){ - highlightRecursor(el,escapeRegex(innerTerms[a])) + highlightRecursor(el, escapeRegexCharacters(innerTerms[a])) } } else { try{ - new RegExp(opts.highlightTerms[i],"gmi") // check to make sure the pattern wont cause issues + new RegExp(opts.highlightTerms[i],"gmi"); // check to make sure the pattern wont cause issues } catch(e){ - el.innerHTML+='
Your highlight regex pattern - '+opts.highlightTerms[i]+' - is malformed.
Your highlights have been disabled until they are next edited
Thrown exception: '+e+'
' + el.innerHTML += '
Your highlight regex pattern - '+opts.highlightTerms[i]+' - is malformed.
Your highlights have been disabled until they are next edited
Thrown exception: '+e+'
'; regexHasError = true; return; } - highlightRecursor(el,opts.highlightTerms[i]) + highlightRecursor(el, opts.highlightTerms[i]); } } } From c9f1a997bd2e4c6adbac6604dfb69ce9f0f8b115 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Mon, 13 Apr 2020 00:25:48 -0230 Subject: [PATCH 010/111] extra styling fixes --- goon/browserassets/js/browserOutput.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index d20d2eb239e..20162e8d3ca 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -183,11 +183,11 @@ function highlightTerms(el) { if (regexHasError) return; //just stop right there ig the regex is gonna except - function highlightRecursor(element,term){ //recursor function to do the highlighting proper - var regex = new RegExp(term,"gi"); + function highlightRecursor(element, term){ //recursor function to do the highlighting proper + var regex = new RegExp(term, "gi"); function replace(str) { - return str.replace(regex,'$&'); + return str.replace(regex, '$&'); } var s = ''; @@ -198,7 +198,7 @@ function highlightTerms(el) { var next_term = work.substring(ind).search(regex); if(next_term != -1) next_term += ind; - var next_tag = work.indexOf('<',ind); + var next_tag = work.indexOf('<', ind); if(next_tag == -1) { s+=replace(work.substring(ind)); break; @@ -208,12 +208,12 @@ function highlightTerms(el) { break; } else if(next_tag < next_term) { - var temp = work.indexOf('>',next_tag); + var temp = work.indexOf('>', next_tag); s += work.substring(ind,temp+1); ind = temp+1; } else { - s += replace(work.substring(ind,next_tag)); + s += replace(work.substring(ind, next_tag)); ind = next_tag; } } @@ -231,9 +231,9 @@ function highlightTerms(el) { } else { try{ - new RegExp(opts.highlightTerms[i],"gmi"); // check to make sure the pattern wont cause issues + new RegExp(opts.highlightTerms[i], "gmi"); // check to make sure the pattern wont cause issues } catch(e){ - el.innerHTML += '
Your highlight regex pattern - '+opts.highlightTerms[i]+' - is malformed.
Your highlights have been disabled until they are next edited
Thrown exception: '+e+'
'; + el.innerHTML += '
Your highlight regex pattern -- ' + opts.highlightTerms[i] + ' -- is malformed.
Your highlights have been disabled until they are next edited
Thrown exception: '+e+'
'; regexHasError = true; return; } From 177152e9ed93fa469efa698a87b9a74708478d5e Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Fri, 12 Jun 2020 15:03:55 -0500 Subject: [PATCH 011/111] Adds some more action buttons for malf AI abilities, removes the malfunction tab --- .../gamemodes/malfunction/Malf_Modules.dm | 32 +++++++++++++++++- .../antagonists/traitor/datum_traitor.dm | 3 +- code/modules/mob/living/silicon/ai/ai.dm | 20 ++--------- code/modules/power/apc.dm | 3 +- icons/mob/actions/actions.dmi | Bin 122968 -> 123170 bytes 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index c1a907f9191..816eadf55bf 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -83,6 +83,36 @@ else add_ranged_ability(user, enable_text) +/datum/action/innate/ai/choose_modules + name = "Choose Modules" + desc = "Spend your processing time to gain a variety of different abilities." + button_icon_state = "choose_module" + auto_use_uses = FALSE // This is an infinite ability. + +/datum/action/innate/ai/choose_modules/Grant(mob/living/L) + . = ..() + owner_AI.malf_picker = new /datum/module_picker + +/datum/action/innate/ai/choose_modules/Trigger() + . = ..() + owner_AI.malf_picker.use(owner_AI) + +/datum/action/innate/ai/return_to_core + name = "Return to Main Core" + desc = "Leave the APC you are shunted to, and return to your core." + icon_icon = 'icons/obj/power.dmi' + button_icon_state = "apcemag" + auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up. + +/datum/action/innate/ai/return_to_core/Trigger() + . = ..() + var/obj/machinery/power/apc/apc = owner_AI.loc + if(!istype(apc)) // This shouldn't happen but here for safety. + to_chat(src, "You are already in your Main Core.") + return + apc.malfvacate() + qdel(src) + //The datum and interface for the malf unlock menu, which lets them choose actions to unlock. /datum/module_picker var/temp @@ -102,7 +132,7 @@ if(istype(A, initial(AM.power_type))) qdel(A) -/datum/module_picker/proc/use(user as mob) +/datum/module_picker/proc/use(mob/user) var/dat dat += {"Select use of processing time: (currently #[processing_time] left.)

diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index e13fb701317..1ae4b639fc6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -42,7 +42,8 @@ A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it A.show_laws() A.malf_picker.remove_malf_verbs(A) - A.verbs -= /mob/living/silicon/ai/proc/choose_modules + var/datum/action/innate/ai/choose_modules/CM = locate() in A.actions + qdel(CM) qdel(A.malf_picker) if(owner.som) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 85c4ceac427..61808693a1a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -849,13 +849,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "Switched to [network] camera network.") //End of code by Mord_Sith - -/mob/living/silicon/ai/proc/choose_modules() - set category = "Malfunction" - set name = "Choose Module" - - malf_picker.use(src) - /mob/living/silicon/ai/proc/ai_statuschange() set category = "AI Commands" set name = "AI Status" @@ -1026,15 +1019,6 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( return -/mob/living/silicon/ai/proc/corereturn() - set category = "Malfunction" - set name = "Return to Main Core" - - var/obj/machinery/power/apc/apc = loc - if(!istype(apc)) - to_chat(src, "You are already in your Main Core.") - return - apc.malfvacate() //Toggles the luminosity and applies it by re-entereing the camera. /mob/living/silicon/ai/proc/toggle_camera_light() @@ -1242,8 +1226,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - verbs += /mob/living/silicon/ai/proc/choose_modules - malf_picker = new /datum/module_picker + var/datum/action/innate/ai/choose_modules/malf_shop = new + malf_shop.Grant(src) /mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) if(!istype(target)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 234b885284e..8f45b175753 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1057,7 +1057,8 @@ occupier.eyeobj.name = "[occupier.name] (AI Eye)" if(malf.parent) qdel(malf) - occupier.verbs += /mob/living/silicon/ai/proc/corereturn + var/datum/action/innate/ai/return_to_core/R = new + R.Grant(occupier) occupier.cancel_camera() if((seclevel2num(get_security_level()) == SEC_LEVEL_DELTA) && malf.nuking) for(var/obj/item/pinpointer/point in GLOB.pinpointer_list) diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 4ea648dea13e186e033234ab0770e807050af597..80a5dbe5b04642cf2a0bbc39d59fcc2cf18becb1 100644 GIT binary patch delta 20990 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 delta 20774 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%0A@aC2@c06RTc$RpOHqyXH0 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 z From 9955e2e2618f7dea9c600976f98b29e3b2143e74 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 23 Jun 2020 12:30:58 -0700 Subject: [PATCH 012/111] Fixes Brainless Cyborgs --- code/modules/mob/transform_procs.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 2ee4a9d2a9c..989aa6cc9bf 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -82,14 +82,11 @@ O.notify_ai(1) if(O.mind && O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Android") + if(O.mind.role_alt_title == "Android" || O.mind.role_alt_title == "Robot") O.mmi = new /obj/item/mmi/robotic_brain(O) - else if(O.mind.role_alt_title == "Robot") - O.mmi = null //Robots do not have removable brains. else O.mmi = new /obj/item/mmi(O) - - if(O.mmi) O.mmi.transfer_identity(src) //Does not transfer key/client. + O.mmi.transfer_identity(src) //Does not transfer key/client. O.update_pipe_vision() From 8982211e96190b619738749e7b68e52733c00ef4 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 23 Jun 2020 13:36:28 -0700 Subject: [PATCH 013/111] Removes "Android" alt job title for cyborg --- code/game/jobs/job/silicon.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index b6321765861..640dfb4dfe4 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -32,7 +32,7 @@ minimal_player_age = 21 exp_requirements = 300 exp_type = EXP_TYPE_CREW - alt_titles = list("Android", "Robot") + alt_titles = list("Robot") /datum/job/cyborg/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 989aa6cc9bf..8e7adea666b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -82,7 +82,7 @@ O.notify_ai(1) if(O.mind && O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Android" || O.mind.role_alt_title == "Robot") + if(O.mind.role_alt_title == "Robot") O.mmi = new /obj/item/mmi/robotic_brain(O) else O.mmi = new /obj/item/mmi(O) From 3392c4019eef9c7f54b48ca8979b65bba54a65dc Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Sun, 28 Jun 2020 03:12:38 -0500 Subject: [PATCH 014/111] Make /proc/power_restore recharge APC cells --- code/modules/events/apc_short.dm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index d2fe04dcc5d..aa4674b2345 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -59,7 +59,17 @@ log_and_message_admins("APC Short event shorted out [affected_apc_count] APCs.") /proc/power_restore(announce=TRUE) - power_restore_quick(announce) + if(announce) + GLOB.event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') + + // recharge the APCs + for(var/thing in GLOB.apcs) + var/obj/machinery/power/apc/C = thing + var/area/current_area = get_area(C) + if(!is_station_level(C.z)) + continue + if(C.cell) + C.cell.charge = C.cell.maxcharge /proc/power_restore_quick(announce=TRUE) if(announce) From 1dcb43b5b4a2c78f7a19a704b0caed58f2569223 Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Sun, 28 Jun 2020 09:37:32 -0500 Subject: [PATCH 015/111] Removed unused line --- code/modules/events/apc_short.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index aa4674b2345..51511aa60ed 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -65,7 +65,6 @@ // recharge the APCs for(var/thing in GLOB.apcs) var/obj/machinery/power/apc/C = thing - var/area/current_area = get_area(C) if(!is_station_level(C.z)) continue if(C.cell) From 22f133ec25d2442a91d93909741ebbad145bad95 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Sun, 12 Jul 2020 03:33:08 +0200 Subject: [PATCH 016/111] Build time for windows and co --- .../game/objects/items/stacks/sheets/glass.dm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 4d3e3181726..52d9cf6818e 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -15,11 +15,11 @@ */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 0), \ - new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 0, on_floor = TRUE), \ - new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 0, on_floor = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ + new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ + new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ )) /obj/item/stack/sheet/glass @@ -79,8 +79,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe/window("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ null, \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/rglass @@ -105,8 +105,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmaglass @@ -148,8 +148,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ */ GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmarglass @@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ ..() GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 5, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/titaniumglass @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( ..() GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 0, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 5, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/plastitaniumglass From e763dd70af4039ed3ed90064e3e41fd9e0431e17 Mon Sep 17 00:00:00 2001 From: Autumn211 Date: Mon, 13 Jul 2020 16:06:24 +0100 Subject: [PATCH 017/111] Makes job berets have no overlap cost in loadout --- .../client/preference/loadout/loadout_hat.dm | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 7d6275e09e4..758e70f654f 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -42,11 +42,6 @@ display_name = "fedora, brown" path = /obj/item/clothing/head/fedora/brownfedora -/datum/gear/hat/beretsec - display_name = "security beret" - path = /obj/item/clothing/head/beret/sec - allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") - /datum/gear/hat/capcsec display_name = "security corporate cap" path = /obj/item/clothing/head/soft/sec/corp @@ -113,32 +108,54 @@ display_name = "cowboy hat, pink" path = /obj/item/clothing/head/cowboyhat/pink -/datum/gear/hat/pr_beret +//Berets Refactor +//Defining all Job Berets as no-overlap +//Somehow this doesn't break the DB. +/datum/gear/hat/beret/job + subtype_path = /datum/gear/hat/beret/job + subtype_cost_overlap = FALSE + +/datum/gear/hat/beret/purple display_name = "beret, purple" path = /obj/item/clothing/head/beret/purple_normal -/datum/gear/hat/bl_beret +/datum/gear/hat/beret/black display_name = "beret, black" path = /obj/item/clothing/head/beret/black -/datum/gear/hat/blu_beret +/datum/gear/hat/beret/blue display_name = "beret, blue" path = /obj/item/clothing/head/beret/blue -/datum/gear/hat/red_beret +/datum/gear/hat/beret/red display_name = "beret, red" path = /obj/item/clothing/head/beret -/datum/gear/hat/sci_beret +/datum/gear/hat/beret/job/sec + display_name = "security beret" + path = /obj/item/clothing/head/beret/sec + allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") + +/datum/gear/hat/beret/job/sci display_name = "science beret" path = /obj/item/clothing/head/beret/sci allowed_roles = list("Research Director", "Scientist") -/datum/gear/hat/med_beret +/datum/gear/hat/beret/job/med display_name = "medical beret" path = /obj/item/clothing/head/beret/med allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner") +/datum/gear/hat/beret/job/eng + display_name = "engineering beret" + path = /obj/item/clothing/head/beret/eng + allowed_roles = list("Chief Engineer", "Station Engineer") + +/datum/gear/hat/beret/job/atmos + display_name = "atmospherics beret" + path = /obj/item/clothing/head/beret/atmos + allowed_roles = list("Chief Engineer", "Life Support Specialist") + /datum/gear/hat/surgicalcap_purple display_name = "surgical cap, purple" path = /obj/item/clothing/head/surgery/purple From 0766f5541b4d8a0f25c56d095d5688c56e29e320 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Mon, 13 Jul 2020 21:56:31 -0500 Subject: [PATCH 018/111] fox changes --- code/game/gamemodes/malfunction/Malf_Modules.dm | 6 ------ code/modules/antagonists/traitor/datum_traitor.dm | 6 ++---- code/modules/mob/living/silicon/ai/ai.dm | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 816eadf55bf..6048145879d 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -126,12 +126,6 @@ if((AM.power_type && AM.power_type != /datum/action/innate/ai) || AM.upgrade) possible_modules += AM -/datum/module_picker/proc/remove_malf_verbs(mob/living/silicon/ai/AI) //Removes all malfunction-related abilities from the target AI. - for(var/datum/AI_Module/AM in possible_modules) - for(var/datum/action/A in AI.actions) - if(istype(A, initial(AM.power_type))) - qdel(A) - /datum/module_picker/proc/use(mob/user) var/dat dat += {"Select use of processing time: (currently #[processing_time] left.)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 1ae4b639fc6..957300326a6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -41,10 +41,8 @@ A.common_radio.channels.Remove("Syndicate") // De-traitored AIs can still state laws over the syndicate channel without this A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it A.show_laws() - A.malf_picker.remove_malf_verbs(A) - var/datum/action/innate/ai/choose_modules/CM = locate() in A.actions - qdel(CM) - qdel(A.malf_picker) + A.remove_malf_abilities() + QDEL_NULL(A.malf_picker) if(owner.som) var/datum/mindslaves/slaved = owner.som diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 61808693a1a..4959fb1cab9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -63,6 +63,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( //MALFUNCTION var/datum/module_picker/malf_picker + var/datum/action/innate/ai/choose_modules/modules_action var/list/datum/AI_Module/current_modules = list() var/can_dominate_mechs = 0 var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead @@ -1226,8 +1227,17 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( to_chat(src, "In the top right corner of the screen you will find the Malfunctions tab, where you can purchase various abilities, from upgraded surveillance to station ending doomsday devices.") to_chat(src, "You are also capable of hacking APCs, which grants you more points to spend on your Malfunction powers. The drawback is that a hacked APC will give you away if spotted by the crew. Hacking an APC takes 60 seconds.") view_core() //A BYOND bug requires you to be viewing your core before your verbs update - var/datum/action/innate/ai/choose_modules/malf_shop = new - malf_shop.Grant(src) + malf_picker = new /datum/module_picker + modules_action = new(malf_picker) + modules_action.Grant(src) + +///Removes all malfunction-related /datum/action's from the target AI. +/mob/living/silicon/ai/proc/remove_malf_abilities() + QDEL_NULL(modules_action) + for(var/datum/AI_Module/AM in current_modules) + for(var/datum/action/A in actions) + if(istype(A, initial(AM.power_type))) + qdel(A) /mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) if(!istype(target)) From cb06ebdd9fd81cf305e04938a50b5c40ce3e1775 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Mon, 13 Jul 2020 22:05:56 -0700 Subject: [PATCH 019/111] Refactor complete. Matches added. --- code/game/atoms_movable.dm | 3 + code/game/objects/effects/decals/remains.dm | 7 ++ code/game/objects/effects/spiders.dm | 9 ++ code/game/objects/items/trash.dm | 6 ++ code/game/objects/items/weapons/cigs.dm | 5 + code/game/objects/items/weapons/lighters.dm | 8 +- code/game/objects/items/weapons/shards.dm | 5 + .../food_and_drinks/drinks/drinks/bottle.dm | 5 + code/modules/hydroponics/grown.dm | 5 + .../mob/living/silicon/robot/drone/drone.dm | 24 +++++ .../living/silicon/robot/drone/drone_items.dm | 99 +------------------ .../living/simple_animal/friendly/lizard.dm | 10 ++ .../living/simple_animal/friendly/mouse.dm | 10 ++ code/modules/power/lighting.dm | 6 ++ 14 files changed, 106 insertions(+), 96 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ab5ff19462a..00009c8eeca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -567,3 +567,6 @@ /atom/movable/proc/portal_destroyed(obj/effect/portal/P) return + +/atom/movable/proc/decompile_act(obj/item/matter_decompiler/C, mob/user) // For drones to decompile mobs and objs. See drone for an example. + return FALSE diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 9a879a02da3..9747630fff1 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -28,6 +28,13 @@ icon_state = "remainsrobot" anchored = TRUE +/obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 1 + C.stored_comms["metal"] += 2 + C.stored_comms["plastic"] += 2 + qdel(src) + return TRUE + /obj/effect/decal/remains/slime name = "You shouldn't see this" desc = "Noooooooooooooooooooooo" diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 7af5d7a998f..54560d817eb 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -190,6 +190,15 @@ to_chat(S, "You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist [S.master_commander.p_them()] in completing [S.master_commander.p_their()] goals at any cost.") qdel(src) +/obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() + /obj/effect/decal/cleanable/spiderling_remains name = "spiderling remains" desc = "Green squishy mess." diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7cf48095e72..bbb8ebd55b8 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -8,6 +8,12 @@ desc = "This is rubbish." resistance_flags = FLAMMABLE +/obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["metal"] += 1 + C.stored_comms["plastic"] += 2 + qdel(src) + return TRUE + /obj/item/trash/raisins name = "4no raisins" icon_state= "4no_raisins" diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 8c2c3e85917..73e6a93ffc9 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -311,6 +311,11 @@ LIGHTERS ARE IN LIGHTERS.DM pixel_y = rand(-10,10) transform = turn(transform,rand(0,360)) +/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["plastic"] += 1 + qdel(src) + return TRUE + /obj/item/cigbutt/cigarbutt name = "cigar butt" desc = "A manky old cigar butt." diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 740079db8e1..1bfeeabae03 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -244,12 +244,18 @@ else ..() +/obj/item/match/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(burnt) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/proc/help_light_cig(mob/living/M) var/mask_item = M.get_item_by_slot(slot_wear_mask) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item - /obj/item/match/firebrand name = "firebrand" desc = "An unlit firebrand. It makes you wonder why it's not just called a stick." diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 52c2aea5ddb..6daabffe000 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -88,6 +88,11 @@ playsound(loc, 'sound/effects/glass_step.ogg', 50, TRUE) return ..() +/obj/item/shard/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/shard/plasma name = "plasma shard" desc = "A shard of plasma glass. Considerably tougher then normal glass shards. Apparently not tough enough to be a window." diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 4515a62d86b..f47707bd5d2 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -141,6 +141,11 @@ var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") sharp = 1 +/obj/item/broken_bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + /obj/item/reagent_containers/food/drinks/bottle/gin name = "Griffeater Gin" desc = "A bottle of high quality gin, produced in the New London Space Station." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index a3b522187e2..5ad8a5f32f4 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -168,6 +168,11 @@ return return ..() +/obj/item/reagent_containers/food/snacks/grown/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["wood"] += 4 + qdel(src) + return TRUE + // For item-containing growns such as eggy or gatfruit /obj/item/reagent_containers/food/snacks/grown/shell/attack_self(mob/user) user.unEquip(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ff7f7fba084..219e56ea08a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -354,3 +354,27 @@ /mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) if(affect_silicon) return ..() + +/mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!client && istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = C.loc + to_chat(D, "You begin decompiling the other drone.") + + if(!do_after(D, 50, target = src.loc)) + to_chat(D, "You need to remain still while decompiling such a large object.") + return + + if(!src || !D) return ..() + + to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + + qdel(src) + new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) + + C.stored_comms["metal"] += 15 + C.stored_comms["glass"] += 15 + C.stored_comms["wood"] += 5 + C.stored_comms["plastic"] += 5 + + return TRUE + return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 8f2b9fee6ae..abc7b2cf865 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -158,8 +158,7 @@ /obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return -/obj/item/matter_decompiler/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params) - +/obj/item/matter_decompiler/afterattack(atom/target, mob/living/user, proximity, params) if(!proximity) return //Not adjacent. //We only want to deal with using this on turfs. Specific items aren't important. @@ -170,99 +169,9 @@ //Used to give the right message. var/grabbed_something = 0 - for(var/mob/M in T) - if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse)) - src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.") - new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(M) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - return - - else if(istype(M,/mob/living/silicon/robot/drone) && !M.client) - - var/mob/living/silicon/robot/drone/D = src.loc - - if(!istype(D)) - return - - to_chat(D, "You begin decompiling the other drone.") - - if(!do_after(D, 50, target = target)) - to_chat(D, "You need to remain still while decompiling such a large object.") - return - - if(!M || !D) return - - to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - - qdel(M) - new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - - stored_comms["metal"] += 15 - stored_comms["glass"] += 15 - stored_comms["wood"] += 5 - stored_comms["plastic"] += 5 - - return - else - continue - - for(var/obj/W in T) - //Different classes of items give different commodities. - if(istype(W,/obj/item/cigbutt)) - stored_comms["plastic"]++ - else if(istype(W,/obj/structure/spider/spiderling)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/item/light)) - var/obj/item/light/L = W - if(L.status >= 2) //In before someone changes the inexplicably local defines. ~ Z - stored_comms["metal"]++ - stored_comms["glass"]++ - else - continue - else if(istype(W,/obj/effect/decal/remains/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/trash)) - stored_comms["metal"]++ - stored_comms["plastic"]++ - stored_comms["plastic"]++ - else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/ammo_casing)) - stored_comms["metal"]++ - else if(istype(W,/obj/item/shard)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/reagent_containers/food/snacks/grown)) - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - stored_comms["wood"]++ - else if(istype(W,/obj/item/broken_bottle)) - stored_comms["glass"]++ - stored_comms["glass"]++ - stored_comms["glass"]++ - else if(istype(W,/obj/item/light/tube) || istype(W,/obj/item/light/bulb)) - stored_comms["glass"]++ - else - continue - - qdel(W) - grabbed_something = 1 + for(var/atom/movable/A in T) + if(A.decompile_act(src)) // Each decompileable mob or obj needs to have this defined + grabbed_something = 1 if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index 96688963b73..b8c3ac607fd 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,3 +23,13 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1) can_collar = 1 gold_core_spawnable = FRIENDLY_SPAWN + +/mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!istype(user, /mob/living/silicon/robot/drone)) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index a48b36cb0c7..fd91278761f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -234,3 +234,13 @@ gold_core_spawnable = NO_SPAWN can_collar = 0 butcher_results = list(/obj/item/stack/sheet/metal = 1) + +/mob/living/simple_animal/mouse/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!(istype(user, /mob/living/silicon/robot/drone))) + C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) + qdel(src) + C.stored_comms["wood"] += 2 + C.stored_comms["plastic"] += 2 + return TRUE + return ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 0a31d882488..3e8d71b3280 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -634,6 +634,12 @@ shatter() return ..() +/obj/item/light/decompile_act(obj/item/matter_decompiler/C, mob/user) + C.stored_comms["glass"] += 1 + C.stored_comms["metal"] += 1 + qdel(src) + return TRUE + /obj/item/light/tube name = "light tube" desc = "A replacement light tube." From f7028b7fef527bf8f6657b4e2849715df3523521 Mon Sep 17 00:00:00 2001 From: Patrick Meade Date: Tue, 14 Jul 2020 03:00:48 -0500 Subject: [PATCH 020/111] Use proper procs for obtaining cell and changing charge --- code/modules/events/apc_short.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/events/apc_short.dm b/code/modules/events/apc_short.dm index 51511aa60ed..c19b6cbe8b7 100644 --- a/code/modules/events/apc_short.dm +++ b/code/modules/events/apc_short.dm @@ -64,11 +64,12 @@ // recharge the APCs for(var/thing in GLOB.apcs) - var/obj/machinery/power/apc/C = thing - if(!is_station_level(C.z)) + var/obj/machinery/power/apc/A = thing + if(!is_station_level(A.z)) continue - if(C.cell) - C.cell.charge = C.cell.maxcharge + var/obj/item/stock_parts/cell/C = A.get_cell() + if(C) + C.give(C.maxcharge) /proc/power_restore_quick(announce=TRUE) if(announce) From 93b43721f3d1be9522dbf5c5d54ec5cb3164e535 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 01:05:12 -0700 Subject: [PATCH 021/111] Adds empty cig packets --- code/game/objects/items/weapons/storage/fancy.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index f0ab5bd5ac7..37f568fa51a 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -215,6 +215,13 @@ //if we get this far, handle the insertion checks as normal .=..() +/obj/item/storage/fancy/cigarettes/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!length(contents)) + C.stored_comms["wood"] += 1 + qdel(src) + return TRUE + return ..() + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo packet" desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" From 0911425f2b399f73e0da2019b8fa12215a12d900 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 01:43:00 -0700 Subject: [PATCH 022/111] Final tweaks and fixes --- code/modules/food_and_drinks/drinks/drinks/bottle.dm | 7 +++++++ code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- code/modules/mob/living/silicon/robot/drone/drone_items.dm | 2 +- code/modules/reagents/reagent_containers/bottle.dm | 7 +++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index f47707bd5d2..f77d4b60ab4 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -124,6 +124,13 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() +/obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + //Keeping this here for now, I'll ask if I should keep it here. /obj/item/broken_bottle name = "Broken Bottle" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 219e56ea08a..383dee9057a 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -368,8 +368,8 @@ to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - qdel(src) new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) + qdel(src) C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index abc7b2cf865..7ac12c0a3e4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -170,7 +170,7 @@ var/grabbed_something = 0 for(var/atom/movable/A in T) - if(A.decompile_act(src)) // Each decompileable mob or obj needs to have this defined + if(A.decompile_act(src, usr)) // Each decompileable mob or obj needs to have this defined grabbed_something = 1 if(grabbed_something) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 6c836988e8b..4274c3114db 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -42,6 +42,13 @@ var/image/lid = image(icon, src, "lid_bottle") overlays += lid +/obj/item/reagent_containers/glass/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) + if(!reagents.total_volume) + C.stored_comms["glass"] += 3 + qdel(src) + return TRUE + return ..() + /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" desc = "A small bottle containing toxic compounds." From b30ff7e2e967b0ffb25caec9983a017ad8656d7c Mon Sep 17 00:00:00 2001 From: warior4356 Date: Tue, 14 Jul 2020 21:26:45 -0700 Subject: [PATCH 023/111] Minor fixes. Removes Plastic --- code/game/objects/effects/decals/remains.dm | 5 ++--- code/game/objects/effects/spiders.dm | 7 ++++--- code/game/objects/items/trash.dm | 5 +++-- code/game/objects/items/weapons/cigs.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 15 +++++++-------- .../mob/living/silicon/robot/drone/drone_items.dm | 15 ++++----------- .../mob/living/simple_animal/friendly/lizard.dm | 7 ++++--- .../mob/living/simple_animal/friendly/mouse.dm | 7 ++++--- 8 files changed, 29 insertions(+), 34 deletions(-) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 9747630fff1..e750c15e761 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -29,9 +29,8 @@ anchored = TRUE /obj/effect/decal/remains/robot/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["glass"] += 1 - C.stored_comms["metal"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + C.stored_comms["metal"] += 3 qdel(src) return TRUE diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 54560d817eb..9dd1c771b17 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -192,10 +192,11 @@ /obj/structure/spider/spiderling/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!istype(user, /mob/living/silicon/robot/drone)) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") - qdel(src) + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [user] into your decompiler. It makes a series of visceral crunching noises.") C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index bbb8ebd55b8..8508c741524 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -9,8 +9,9 @@ resistance_flags = FLAMMABLE /obj/item/trash/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["metal"] += 1 - C.stored_comms["plastic"] += 2 + C.stored_comms["metal"] += 2 + C.stored_comms["wood"] += 1 + C.stored_comms["glass"] += 1 qdel(src) return TRUE diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 73e6a93ffc9..30ad91beffa 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -312,7 +312,7 @@ LIGHTERS ARE IN LIGHTERS.DM transform = turn(transform,rand(0,360)) /obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user) - C.stored_comms["plastic"] += 1 + C.stored_comms["wood"] += 1 qdel(src) return TRUE diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 383dee9057a..295fa15a672 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -357,24 +357,23 @@ /mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!client && istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = C.loc - to_chat(D, "You begin decompiling the other drone.") + to_chat(user, "You begin decompiling the other drone.") - if(!do_after(D, 50, target = src.loc)) - to_chat(D, "You need to remain still while decompiling such a large object.") + if(!do_after(user, 5 SECONDS, target = loc)) + to_chat(user, "You need to remain still while decompiling such a large object.") return - if(!src || !D) return ..() + if(QDELETED(src) || QDELETED(user)) + return ..() - to_chat(D, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") + to_chat(user, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - qdel(src) C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 C.stored_comms["wood"] += 5 - C.stored_comms["plastic"] += 5 + qdel(src) return TRUE return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7ac12c0a3e4..a0582c135e4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -151,8 +151,7 @@ var/list/stored_comms = list( "metal" = 0, "glass" = 0, - "wood" = 0, - "plastic" = 0 + "wood" = 0 ) /obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) @@ -167,11 +166,11 @@ return //Used to give the right message. - var/grabbed_something = 0 + var/grabbed_something = FALSE for(var/atom/movable/A in T) - if(A.decompile_act(src, usr)) // Each decompileable mob or obj needs to have this defined - grabbed_something = 1 + if(A.decompile_act(src, user)) // Each decompileable mob or obj needs to have this defined + grabbed_something = TRUE if(grabbed_something) to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") @@ -262,11 +261,5 @@ stack_wood = new /obj/item/stack/sheet/wood(src.module) stack_wood.amount = 1 stack = stack_wood - if("plastic") - if(!stack_plastic) - stack_plastic = new /obj/item/stack/sheet/plastic(src.module) - stack_plastic.amount = 1 - stack = stack_plastic - stack.amount++ decompiler.stored_comms[type]-- diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index b8c3ac607fd..566791786f6 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -26,10 +26,11 @@ /mob/living/simple_animal/lizard/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!istype(user, /mob/living/silicon/robot/drone)) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(src) C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fd91278761f..152e2494132 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -237,10 +237,11 @@ /mob/living/simple_animal/mouse/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!(istype(user, /mob/living/silicon/robot/drone))) - C.loc.visible_message("[C.loc] sucks [src] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") + user.visible_message("[user] sucks [src] into its decompiler. There's a horrible crunching noise.", \ + "It's a bit of a struggle, but you manage to suck [src] into your decompiler. It makes a series of visceral crunching noises.") new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(src) C.stored_comms["wood"] += 2 - C.stored_comms["plastic"] += 2 + C.stored_comms["glass"] += 2 + qdel(src) return TRUE return ..() From 2555c365c3fe7d2c8ccdcac929d40791fb2ec956 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 15 Jul 2020 15:55:19 +0100 Subject: [PATCH 024/111] Removes duplicate helper --- code/controllers/subsystem/events.dm | 26 +++++++++++++------------- code/controllers/subsystem/vote.dm | 2 +- code/defines/procs/admin.dm | 6 +----- code/modules/admin/admin_verbs.dm | 6 +++--- code/modules/admin/verbs/adminsay.dm | 2 +- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 1a6e073c808..390c6bc1a62 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -212,38 +212,38 @@ SUBSYSTEM_DEF(events) if(href_list["toggle_report"]) report_at_round_end = !report_at_round_end - admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") + log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.") else if(href_list["dec_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/decrease = (60 * RaiseToPower(10, text2num(href_list["dec_timer"]))) EC.next_event_time -= decrease - admin_log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by [decrease/600] minute(s).") + log_and_message_admins("decreased timer for [GLOB.severity_to_string[EC.severity]] events by [decrease/600] minute(s).") else if(href_list["inc_timer"]) var/datum/event_container/EC = locate(href_list["event"]) var/increase = (60 * RaiseToPower(10, text2num(href_list["inc_timer"]))) EC.next_event_time += increase - admin_log_and_message_admins("increased timer for [GLOB.severity_to_string[EC.severity]] events by [increase/600] minute(s).") + log_and_message_admins("increased timer for [GLOB.severity_to_string[EC.severity]] events by [increase/600] minute(s).") else if(href_list["select_event"]) var/datum/event_container/EC = locate(href_list["select_event"]) var/datum/event_meta/EM = EC.SelectEvent() if(EM) - admin_log_and_message_admins("has queued the [GLOB.severity_to_string[EC.severity]] event '[EM.name]'.") + log_and_message_admins("has queued the [GLOB.severity_to_string[EC.severity]] event '[EM.name]'.") else if(href_list["pause"]) var/datum/event_container/EC = locate(href_list["pause"]) EC.delayed = !EC.delayed - admin_log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [GLOB.severity_to_string[EC.severity]] events.") + log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [GLOB.severity_to_string[EC.severity]] events.") else if(href_list["interval"]) var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null if(delay && delay > 0) var/datum/event_container/EC = locate(href_list["interval"]) EC.delay_modifier = delay - admin_log_and_message_admins("has set the interval modifier for [GLOB.severity_to_string[EC.severity]] events to [EC.delay_modifier].") + log_and_message_admins("has set the interval modifier for [GLOB.severity_to_string[EC.severity]] events to [EC.delay_modifier].") else if(href_list["stop"]) if(alert("Stopping an event may have unintended side-effects. Continue?","Stopping Event!","Yes","No") != "Yes") return var/datum/event/E = locate(href_list["stop"]) var/datum/event_meta/EM = E.event_meta - admin_log_and_message_admins("has stopped the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has stopped the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") E.kill() else if(href_list["view_events"]) selected_event_container = locate(href_list["view_events"]) @@ -265,23 +265,23 @@ SUBSYSTEM_DEF(events) var/datum/event_meta/EM = locate(href_list["set_weight"]) EM.weight = weight if(EM != new_event) - admin_log_and_message_admins("has changed the weight of the [GLOB.severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].") + log_and_message_admins("has changed the weight of the [GLOB.severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].") else if(href_list["toggle_oneshot"]) var/datum/event_meta/EM = locate(href_list["toggle_oneshot"]) EM.one_shot = !EM.one_shot if(EM != new_event) - admin_log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["toggle_enabled"]) var/datum/event_meta/EM = locate(href_list["toggle_enabled"]) EM.enabled = !EM.enabled - admin_log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["remove"]) if(alert("This will remove the event from rotation. Continue?","Removing Event!","Yes","No") != "Yes") return var/datum/event_meta/EM = locate(href_list["remove"]) var/datum/event_container/EC = locate(href_list["EC"]) EC.available_events -= EM - admin_log_and_message_admins("has removed the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") + log_and_message_admins("has removed the [GLOB.severity_to_string[EM.severity]] event '[EM.name]'.") else if(href_list["add"]) if(!new_event.name || !new_event.event_type) return @@ -289,12 +289,12 @@ SUBSYSTEM_DEF(events) return new_event.severity = selected_event_container.severity selected_event_container.available_events += new_event - admin_log_and_message_admins("has added \a [GLOB.severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].") + log_and_message_admins("has added \a [GLOB.severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].") new_event = new else if(href_list["clear"]) var/datum/event_container/EC = locate(href_list["clear"]) if(EC.next_event) - admin_log_and_message_admins("has dequeued the [GLOB.severity_to_string[EC.severity]] event '[EC.next_event.name]'.") + log_and_message_admins("has dequeued the [GLOB.severity_to_string[EC.severity]] event '[EC.next_event.name]'.") EC.next_event = null Interact(usr) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index b0110258da7..0b91e6b3467 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -367,7 +367,7 @@ SUBSYSTEM_DEF(vote) var/votedesc = capitalize(mode) if(mode == "custom") votedesc += " ([question])" - admin_log_and_message_admins("cancelled the running [votedesc] vote.") + log_and_message_admins("cancelled the running [votedesc] vote.") reset() if("toggle_restart") if(admin) diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index fb8ca665906..23b485ad252 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -83,10 +83,6 @@ var/message = "[key_name(whom, 0)][isAntag(whom) ? "(ANTAG)" : ""][isLivingSSD(whom) ? "(SSD!)": ""]" return message -/proc/log_and_message_admins(var/message as text) +/proc/log_and_message_admins(message) log_admin("[key_name(usr)] " + message) message_admins("[key_name_admin(usr)] " + message) - -/proc/admin_log_and_message_admins(var/message as text) - log_admin("[key_name(usr)] " + message) - message_admins("[key_name_admin(usr)] " + message, 1) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 80a60957c75..f892d015da2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -826,7 +826,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( return if(holder) - admin_log_and_message_admins("is altering the appearance of [H].") + log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -857,10 +857,10 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) if("Yes") - admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.") + log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, without whitelisting of races.") H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) if("No") - admin_log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.") + log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.") H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index a0e8b4b9088..5a0425af30a 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -78,5 +78,5 @@ C.verbs -= msay to_chat(C, "Mentor chat has been disabled.") - admin_log_and_message_admins("toggled mentor chat [enabling ? "on" : "off"].") + log_and_message_admins("toggled mentor chat [enabling ? "on" : "off"].") feedback_add_details("admin_verb", "TMC") From b511d55cd4f1e9d560ec31b029a89f87dcd4d7bb Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 15 Jul 2020 20:04:08 +0100 Subject: [PATCH 025/111] Gamebreaking bug fix immediately --- code/game/objects/items/devices/radio/radio.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 009ec01ef43..7ddf11ab451 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -272,7 +272,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( tcm.sender_job = "Automated Announcement" tcm.vname = "synthesized voice" tcm.data = SIGNALTYPE_AINOTRACK - // Datum radios dont have a location (obviously + // Datum radios dont have a location (obviously) if(loc && loc.z) tcm.source_level = loc.z // For anyone that reads this: This used to pull from a LIST from the CONFIG DATUM. WHYYYYYYYYY!!!!!!!! -aa else From 2c1cd44795651d01215dd1f78d050055f47bcbcb Mon Sep 17 00:00:00 2001 From: Autumn211 Date: Wed, 15 Jul 2020 20:07:43 +0100 Subject: [PATCH 026/111] Makes various job-specific gear not overlap cost --- .../preference/loadout/loadout_accessories.dm | 17 ++++++++++------- .../client/preference/loadout/loadout_suit.dm | 16 ++++++++++------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 09cc082dc5d..8805c6dd9a9 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -154,6 +154,9 @@ display_name = "corset, blue" path = /obj/item/clothing/accessory/corset/blue +/datum/gear/accessory/armband/job + subtype_path = /datum/gear/accessory/armband/job + subtype_cost_overlap = FALSE /datum/gear/accessory/armband_red display_name = "armband" @@ -163,37 +166,37 @@ display_name = "armband, blue-yellow" path = /obj/item/clothing/accessory/armband/yb -/datum/gear/accessory/armband_sec +/datum/gear/accessory/armband/job/sec display_name = " armband, security" path = /obj/item/clothing/accessory/armband/sec allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot") -/datum/gear/accessory/armband_cargo +/datum/gear/accessory/armband/job/cargo display_name = "cargo armband" path = /obj/item/clothing/accessory/armband/cargo allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner") -/datum/gear/accessory/armband_medical +/datum/gear/accessory/armband/job/medical display_name = "armband, medical" path = /obj/item/clothing/accessory/armband/med allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician") -/datum/gear/accessory/armband_emt +/datum/gear/accessory/armband/job/emt display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen allowed_roles = list("Paramedic", "Brig Physician") -/datum/gear/accessory/armband_engineering +/datum/gear/accessory/armband/job/engineering display_name = "armband, engineering" path = /obj/item/clothing/accessory/armband/engine allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist") -/datum/gear/accessory/armband_hydro +/datum/gear/accessory/armband/job/hydro display_name = "armband, hydroponics" path = /obj/item/clothing/accessory/armband/hydro allowed_roles = list("Botanist") -/datum/gear/accessory/armband_sci +/datum/gear/accessory/armband/job/sci display_name = "armband, science" path = /obj/item/clothing/accessory/armband/science allowed_roles = list("Research Director","Scientist", "Roboticist") diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm index 32a9bae99e7..57e7ea63414 100644 --- a/code/modules/client/preference/loadout/loadout_suit.dm +++ b/code/modules/client/preference/loadout/loadout_suit.dm @@ -175,32 +175,36 @@ display_name = "regal shawl" path = /obj/item/clothing/suit/mantle/regal -/datum/gear/suit/captain_cloak +/datum/gear/suit/mantle/job + subtype_path = /datum/gear/suit/mantle/job + subtype_cost_overlap = FALSE + +/datum/gear/suit/mantle/job/captain display_name = "mantle, captain" path = /obj/item/clothing/suit/mantle/armor/captain allowed_roles = list("Captain") -/datum/gear/suit/ce_mantle +/datum/gear/suit/mantle/job/ce display_name = "mantle, chief engineer" path = /obj/item/clothing/suit/mantle/chief_engineer allowed_roles = list("Chief Engineer") -/datum/gear/suit/cmo_mantle +/datum/gear/suit/mantle/job/cmo display_name = "mantle, chief medical officer" path = /obj/item/clothing/suit/mantle/labcoat/chief_medical_officer allowed_roles = list("Chief Medical Officer") -/datum/gear/suit/armored_shawl +/datum/gear/suit/mantle/job/hos display_name = "mantle, head of security" path = /obj/item/clothing/suit/mantle/armor allowed_roles = list("Head of Security") -/datum/gear/suit/hop_shawl +/datum/gear/suit/mantle/job/hop display_name = "mantle, head of personnel" path = /obj/item/clothing/suit/mantle/armor/head_of_personnel allowed_roles = list("Head of Personnel") -/datum/gear/suit/rd_mantle +/datum/gear/suit/mantle/job/rd display_name = "mantle, research director" path = /obj/item/clothing/suit/mantle/labcoat allowed_roles = list("Research Director") From d634ac5e1afde6680346b0ba675cd3ceda4abbb2 Mon Sep 17 00:00:00 2001 From: Oyu-De Date: Wed, 15 Jul 2020 22:14:50 +0300 Subject: [PATCH 027/111] Spelling mistake correction --- code/modules/mob/living/carbon/human/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 31825ea3765..60891563ad2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -341,7 +341,7 @@ if(decaylevel == 3) msg += "[p_they(TRUE)] [p_are()] rotting and blackened, the skin sloughing off. The smell is indescribably foul.\n" if(decaylevel == 4) - msg += "[p_they(TRUE)] [p_are()] mostly dessicated now, with only bones remaining of what used to be a person.\n" + msg += "[p_they(TRUE)] [p_are()] mostly desiccated now, with only bones remaining of what used to be a person.\n" if(hasHUD(user,"security")) var/perpname = get_visible_name(TRUE) From b3102cd51419b0288f815ddb129a4639f1a3b1a1 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 16 Jul 2020 09:49:00 +0100 Subject: [PATCH 028/111] Makes it so only one theta station can spawn --- code/datums/ruins/space.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index b81587440d4..799a12f4db9 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -175,6 +175,7 @@ description = "The crew of a space station awaken one hundred years after a crisis. Awaking to a derelict space station on the verge of collapse, and a hostile force of invading \ hivebots. Can the surviving crew overcome the odds and survive and rebuild, or will the cold embrace of the stars become their new home?" cost = 2 + allow_duplicates = FALSE /datum/map_template/ruin/space/wizardcrash id = "wizardcrash" From a0d354771ba07bc4df8009d4c9c64a23739b4874 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 02:56:31 -0700 Subject: [PATCH 029/111] fix player controlled terrors still moving under AI pathing --- .../mob/living/simple_animal/hostile/terror_spiders/ghost.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index daed363b8d9..9db8b6f074f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -42,5 +42,6 @@ to_chat(user, "Someone else already took this spider.") return key = user.key + walk(src, 0) // if spider is moving under ai control (already aggroed on something before player control), then stop AI movement for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") From 304412a5e4fc2dae153e9d0e53204f4950ae8d07 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 03:14:37 -0700 Subject: [PATCH 030/111] move to mob/living/Login so this fix applies to all simple animals --- code/modules/mob/living/login.dm | 2 ++ .../mob/living/simple_animal/hostile/terror_spiders/ghost.dm | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 580996e54d9..1f27521a52e 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -29,4 +29,6 @@ //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() + walk(src, 0) // if mob is moving under ai control, then stop AI movement + return . diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 9db8b6f074f..daed363b8d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -42,6 +42,5 @@ to_chat(user, "Someone else already took this spider.") return key = user.key - walk(src, 0) // if spider is moving under ai control (already aggroed on something before player control), then stop AI movement for(var/mob/dead/observer/G in GLOB.player_list) G.show_message("A ghost has taken control of [src]. ([ghost_follow_link(src, ghost=G)]).") From 4ee54cd806333b012924ea98ea784e537e4a91ac Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 17:44:05 -0700 Subject: [PATCH 031/111] moves proc to simple_animal/Login() --- code/modules/mob/living/login.dm | 2 -- code/modules/mob/living/simple_animal/simple_animal.dm | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 1f27521a52e..580996e54d9 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -29,6 +29,4 @@ //Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways. update_pipe_vision() - walk(src, 0) // if mob is moving under ai control, then stop AI movement - return . diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7d31b5d523b..c3605f47cdb 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -615,3 +615,9 @@ if(pcollar && collar_type) add_overlay("[collar_type]collar") add_overlay("[collar_type]tag") + +/mob/living/simple_animal/Login() + ..() + walk(src, 0) // if mob is moving under ai control, then stop AI movement + return . + From 7ea3528d29f5fef520e69d9ceb5bf3c45d62b40c Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 16 Jul 2020 17:48:44 -0700 Subject: [PATCH 032/111] switches to . = ..() --- code/modules/mob/living/simple_animal/simple_animal.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c3605f47cdb..bfbe7dcb97f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -617,7 +617,6 @@ add_overlay("[collar_type]tag") /mob/living/simple_animal/Login() - ..() + . = ..() walk(src, 0) // if mob is moving under ai control, then stop AI movement - return . From 945a326b7a2f4c199b9d8ac2e6c1d445db7c26be Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 18:33:24 -0700 Subject: [PATCH 033/111] Formatting Fix --- code/modules/mob/living/silicon/robot/drone/drone.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 295fa15a672..5680e5d30d1 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -358,22 +358,16 @@ /mob/living/silicon/robot/drone/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!client && istype(user, /mob/living/silicon/robot/drone)) to_chat(user, "You begin decompiling the other drone.") - if(!do_after(user, 5 SECONDS, target = loc)) to_chat(user, "You need to remain still while decompiling such a large object.") return - if(QDELETED(src) || QDELETED(user)) return ..() - to_chat(user, "You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself.") - new/obj/effect/decal/cleanable/blood/oil(get_turf(src)) - C.stored_comms["metal"] += 15 C.stored_comms["glass"] += 15 C.stored_comms["wood"] += 5 qdel(src) - return TRUE return ..() From fe9b5695c995ac1fa82df1aec5f0b4efd5964bb8 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 23:45:10 -0700 Subject: [PATCH 034/111] Adds boxing glove crate --- code/datums/supplypacks.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a18a9d74f28..37cddd4d187 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1767,6 +1767,16 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY cost = 20 containername = "polo supply crate" +/datum/supply_packs/misc/boxing //For non log spamming cargo brawls! + name = "Boxing Supply Crate" + // 6 brooms, 6 horse masks for the brooms, and 1 beach ball + contains = list(/obj/item/clothing/gloves/boxing/blue, + /obj/item/clothing/gloves/boxing/green, + /obj/item/clothing/gloves/boxing/yellow, + /obj/item/clothing/gloves/boxing) + cost = 15 + containername = "boxing supply crate" + ///////////// Station Goals /datum/supply_packs/misc/station_goal From b722f8186df6b30bdc67cda79f1e78601b19cd80 Mon Sep 17 00:00:00 2001 From: warior4356 Date: Thu, 16 Jul 2020 23:55:03 -0700 Subject: [PATCH 035/111] Update supplypacks.dm --- code/datums/supplypacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 37cddd4d187..c8045dfe1e4 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1769,7 +1769,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY /datum/supply_packs/misc/boxing //For non log spamming cargo brawls! name = "Boxing Supply Crate" - // 6 brooms, 6 horse masks for the brooms, and 1 beach ball + // 4 boxing gloves contains = list(/obj/item/clothing/gloves/boxing/blue, /obj/item/clothing/gloves/boxing/green, /obj/item/clothing/gloves/boxing/yellow, From 82c2cb0c4c9b9d03f17ddc665bbc7bad15e867b5 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Fri, 17 Jul 2020 07:57:45 +0100 Subject: [PATCH 036/111] Allows players to pick body accessories again --- code/__HELPERS/global_lists.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 8ab919f9061..cbc691e3c2a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -28,6 +28,9 @@ // Different tails __init_body_accessory(/datum/body_accessory/tail) + // Setup species:accessory relations + initialize_body_accessory_by_species() + for(var/path in (subtypesof(/datum/surgery))) GLOB.surgeries_list += new path() From 0031d03e93d898e9ab3d48b8e15e9983de65dc22 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:48:20 +0200 Subject: [PATCH 037/111] Fixes runtime --- code/modules/shuttle/ert.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm index 356ca9687dc..5168ce89278 100644 --- a/code/modules/shuttle/ert.dm +++ b/code/modules/shuttle/ert.dm @@ -9,10 +9,10 @@ /obj/machinery/computer/shuttle/ert/Topic(href, href_list) if(href_list["move"]) var/authorized_roles = list(SPECIAL_ROLE_ERT, SPECIAL_ROLE_DEATHSQUAD) - if(!((usr.mind.assigned_role in authorized_roles) || is_admin(usr))) + if(!((usr.mind?.assigned_role in authorized_roles) || is_admin(usr))) message_admins("Potential ERT shuttle hijack, ERT shuttle moved by unauthorized user: [key_name_admin(usr)]") ..() - + /obj/machinery/computer/camera_advanced/shuttle_docker/ert name = "specops navigation computer" From aa8d9cf26c0bdcfbbf28378b6f55f711d01a3474 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 17 Jul 2020 21:16:47 +0200 Subject: [PATCH 038/111] Fixes a kitchen spike runtime --- code/game/objects/structures/kitchen_spike.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 1f0d4b8b473..ad913540b50 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -77,7 +77,7 @@ /obj/structure/kitchenspike/proc/spike(mob/living/victim) - if(!istype(victim)) + if(!istype(victim) || QDELETED(victim)) return FALSE if(has_buckled_mobs()) //to prevent spam/queing up attacks From 8955dc7db6b04c19de41fbb8637fd2a50b2a224f Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 17 Jul 2020 21:31:55 +0200 Subject: [PATCH 039/111] Actual fix. Did a wrong analysis --- code/game/objects/structures/kitchen_spike.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index ad913540b50..c3f36e42f1d 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -69,15 +69,15 @@ if(isliving(G.affecting)) if(!has_buckled_mobs()) if(do_mob(user, src, 120)) - if(spike(G.affecting)) - G.affecting.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - qdel(G) + var/mob/living/affected = G.affecting + if(spike(affected)) + affected.visible_message("[user] slams [affected] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") return return ..() /obj/structure/kitchenspike/proc/spike(mob/living/victim) - if(!istype(victim) || QDELETED(victim)) + if(!istype(victim)) return FALSE if(has_buckled_mobs()) //to prevent spam/queing up attacks From fd1e880b0d917c0ccab11f6e6b960140ec21577a Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 17 Jul 2020 17:36:38 -0400 Subject: [PATCH 040/111] Fixes Loadout Errors --- .../preference/loadout/loadout_accessories.dm | 25 +++++++--------- .../client/preference/loadout/loadout_hat.dm | 29 +++++++++---------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm index 8805c6dd9a9..b9318fd9e8c 100644 --- a/code/modules/client/preference/loadout/loadout_accessories.dm +++ b/code/modules/client/preference/loadout/loadout_accessories.dm @@ -154,9 +154,6 @@ display_name = "corset, blue" path = /obj/item/clothing/accessory/corset/blue -/datum/gear/accessory/armband/job - subtype_path = /datum/gear/accessory/armband/job - subtype_cost_overlap = FALSE /datum/gear/accessory/armband_red display_name = "armband" @@ -166,41 +163,41 @@ display_name = "armband, blue-yellow" path = /obj/item/clothing/accessory/armband/yb -/datum/gear/accessory/armband/job/sec +/datum/gear/accessory/armband_job + subtype_path = /datum/gear/accessory/armband_job + subtype_cost_overlap = FALSE + +/datum/gear/accessory/armband_job/sec display_name = " armband, security" path = /obj/item/clothing/accessory/armband/sec allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot") -/datum/gear/accessory/armband/job/cargo +/datum/gear/accessory/armband_job/cargo display_name = "cargo armband" path = /obj/item/clothing/accessory/armband/cargo allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner") -/datum/gear/accessory/armband/job/medical +/datum/gear/accessory/armband_job/medical display_name = "armband, medical" path = /obj/item/clothing/accessory/armband/med allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician") -/datum/gear/accessory/armband/job/emt +/datum/gear/accessory/armband_job/emt display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen allowed_roles = list("Paramedic", "Brig Physician") -/datum/gear/accessory/armband/job/engineering +/datum/gear/accessory/armband_job/engineering display_name = "armband, engineering" path = /obj/item/clothing/accessory/armband/engine allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist") -/datum/gear/accessory/armband/job/hydro +/datum/gear/accessory/armband_job/hydro display_name = "armband, hydroponics" path = /obj/item/clothing/accessory/armband/hydro allowed_roles = list("Botanist") -/datum/gear/accessory/armband/job/sci +/datum/gear/accessory/armband_job/sci display_name = "armband, science" path = /obj/item/clothing/accessory/armband/science allowed_roles = list("Research Director","Scientist", "Roboticist") - - - - diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm index 758e70f654f..4993c8502ea 100644 --- a/code/modules/client/preference/loadout/loadout_hat.dm +++ b/code/modules/client/preference/loadout/loadout_hat.dm @@ -108,50 +108,47 @@ display_name = "cowboy hat, pink" path = /obj/item/clothing/head/cowboyhat/pink -//Berets Refactor -//Defining all Job Berets as no-overlap -//Somehow this doesn't break the DB. -/datum/gear/hat/beret/job - subtype_path = /datum/gear/hat/beret/job - subtype_cost_overlap = FALSE - -/datum/gear/hat/beret/purple +/datum/gear/hat/beret_purple display_name = "beret, purple" path = /obj/item/clothing/head/beret/purple_normal -/datum/gear/hat/beret/black +/datum/gear/hat/beret_black display_name = "beret, black" path = /obj/item/clothing/head/beret/black -/datum/gear/hat/beret/blue +/datum/gear/hat/beret_blue display_name = "beret, blue" path = /obj/item/clothing/head/beret/blue -/datum/gear/hat/beret/red +/datum/gear/hat/beret_red display_name = "beret, red" path = /obj/item/clothing/head/beret -/datum/gear/hat/beret/job/sec +/datum/gear/hat/beret_job + subtype_path = /datum/gear/hat/beret_job + subtype_cost_overlap = FALSE + +/datum/gear/hat/beret_job/sec display_name = "security beret" path = /obj/item/clothing/head/beret/sec allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot") -/datum/gear/hat/beret/job/sci +/datum/gear/hat/beret_job/sci display_name = "science beret" path = /obj/item/clothing/head/beret/sci allowed_roles = list("Research Director", "Scientist") -/datum/gear/hat/beret/job/med +/datum/gear/hat/beret_job/med display_name = "medical beret" path = /obj/item/clothing/head/beret/med allowed_roles = list("Chief Medical Officer", "Medical Doctor" , "Virologist", "Brig Physician" , "Coroner") -/datum/gear/hat/beret/job/eng +/datum/gear/hat/beret_job/eng display_name = "engineering beret" path = /obj/item/clothing/head/beret/eng allowed_roles = list("Chief Engineer", "Station Engineer") -/datum/gear/hat/beret/job/atmos +/datum/gear/hat/beret_job/atmos display_name = "atmospherics beret" path = /obj/item/clothing/head/beret/atmos allowed_roles = list("Chief Engineer", "Life Support Specialist") From 0b8e602b1154de4bdb812a54ce10d3bb35991010 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 17 Jul 2020 19:00:47 -0700 Subject: [PATCH 041/111] Arc suggestion --- code/modules/mob/living/simple_animal/simple_animal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bfbe7dcb97f..d4f8e7c4c3d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -617,6 +617,6 @@ add_overlay("[collar_type]tag") /mob/living/simple_animal/Login() - . = ..() + ..() walk(src, 0) // if mob is moving under ai control, then stop AI movement From 4253f695adbffe06403cc82a73ed0d27fbd2e6bb Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Mon, 20 Jul 2020 20:21:22 +0200 Subject: [PATCH 042/111] remove time from windows again --- .../game/objects/items/stacks/sheets/glass.dm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 52d9cf6818e..000ad2d225f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -15,8 +15,8 @@ */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 10, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/basic, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ @@ -79,8 +79,8 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ new/datum/stack_recipe/window("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ null, \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/reinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/reinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/rglass @@ -105,8 +105,8 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmaglass @@ -148,8 +148,8 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ */ GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 5, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 10, on_floor = TRUE, window_checks = TRUE) \ + new/datum/stack_recipe/window("directional reinforced window", /obj/structure/window/plasmareinforced, time = 0, on_floor = TRUE, window_checks = TRUE), \ + new/datum/stack_recipe/window("fulltile reinforced window", /obj/structure/window/full/plasmareinforced, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \ )) /obj/item/stack/sheet/plasmarglass @@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ ..() GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 5, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("shuttle window", /obj/structure/window/full/shuttle, 2, time = 0, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/titaniumglass @@ -191,7 +191,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( ..() GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 5, on_floor = TRUE, window_checks = TRUE) + new/datum/stack_recipe/window("plastitanium window", /obj/structure/window/plastitanium, 2, time = 0, on_floor = TRUE, window_checks = TRUE) )) /obj/item/stack/sheet/plastitaniumglass From aa986436e14764352e75cbf989597fe2af0de8ca Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 08:21:53 +0100 Subject: [PATCH 043/111] Fixes a bad practice in existing TGUIs --- code/game/machinery/computer/crew.dm | 2 +- code/game/objects/items/devices/sensor_device.dm | 2 +- code/modules/recycling/disposal.dm | 2 +- code/modules/tgui/modules/crew_monitor.dm | 2 +- tgui/docs/tutorial-and-examples.md | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 131956ca3c1..d6a1ccdd33c 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -27,7 +27,7 @@ return tgui_interact(user) -/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/computer/crew/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index b83128cf4a5..9133bf37b9c 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -19,5 +19,5 @@ /obj/item/sensor_device/attack_self(mob/user as mob) tgui_interact(user) -/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/item/sensor_device/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) crew_monitor.tgui_interact(user, ui_key, ui, force_open) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 13d88100042..e6dd04408c2 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -265,7 +265,7 @@ update() return -/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/disposal/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "DisposalBin", name, 300, 250, master_ui, state) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index 783498542e4..f0d164df7c6 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -20,7 +20,7 @@ return TRUE -/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) // The 557 may seem random, but its the perfectsize for margins on the nanomap diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index 08bb6f92321..590ea0f0ee7 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -37,7 +37,7 @@ powerful interactions for embedded objects or remote access. Let's start with a very basic hello world. ```dm -/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state) @@ -240,7 +240,7 @@ and builds a new array based on what was returned by that function. ``` If you need more examples of what you can do with React, see the -[interface conversion guide](docs/converting-old-tgui-interfaces.md). +[interface conversion guide](docs/converting-old-nano-interfaces.md). #### Splitting UIs into smaller, modular components @@ -294,7 +294,7 @@ here's what you need (note that you'll probably be forced to clean your shit up upon code review): ```dm -/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. +/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state) From 31ac29d6028695bd9c5483463a9184e7e119642d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2020 08:57:53 +0000 Subject: [PATCH 044/111] Bump lodash from 4.17.15 to 4.17.19 in /tgui Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 905d2871b69..8cc9b0c818e 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -3730,9 +3730,9 @@ lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" From bd27e9f897136f6a26d2ec1da7266045918257fa Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:29:56 +0100 Subject: [PATCH 045/111] Removes MORE hardcoded zlevel numbers (#13882) --- code/game/turfs/simulated/minerals.dm | 2 +- code/modules/events/sentience.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/living/simple_animal/bot/bot.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index ebad3554f18..8bf3e820d3d 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -439,7 +439,7 @@ var/area/A = get_area(bombturf) var/notify_admins = 0 - if(z != 5) + if(!is_mining_level(z)) notify_admins = 1 if(!triggered_by_explosion) message_admins("[key_name_admin(user)] has triggered a gibtonite deposit reaction at [A.name] (JMP).") diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 918746f4595..ab8a405785f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -10,7 +10,7 @@ for(var/mob/living/simple_animal/L in GLOB.alive_mob_list) var/turf/T = get_turf(L) - if (T.z != 1) + if (!is_station_level(T.z)) continue if(!(L in GLOB.player_list) && !L.mind && (L.sentience_type == sentience_type)) potential += L diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8737fdf21b3..c01d04beba8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -273,7 +273,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "Gibtonite active" var/turf/bombturf = get_turf(src) var/notify_admins = 0 - if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel + if(!is_mining_level(z))//Only annoy the admins ingame if we're triggered off the mining zlevel notify_admins = 1 if(notify_admins) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index cb45fd98e8b..e51dc527832 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -756,7 +756,7 @@ Pass a positive integer as an argument to override a bot's default speed. // send a radio signal with multiple data key/values /mob/living/simple_animal/bot/proc/post_signal_multiple(var/freq, var/list/keyval) - if(z != 1) //Bot control will only work on station. + if(!is_station_level(z)) //Bot control will only work on station. return var/datum/radio_frequency/frequency = SSradio.return_frequency(freq) if(!frequency) From 9111a64af97f27197d0d0ab223ebab3b5aff32c0 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 11:33:23 +0200 Subject: [PATCH 046/111] Meat hook fix. Beam runtime fix (#13867) --- code/datums/beam.dm | 3 +-- code/modules/mining/lavaland/loot/tendril_loot.dm | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 19935bda130..3b5c9d2f5fb 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -131,6 +131,5 @@ /atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=3) var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time) - spawn(0) - newbeam.Start() + INVOKE_ASYNC(newbeam, /datum/beam.proc/Start) return newbeam diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index f54bc974f7e..0af08e40c74 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -383,7 +383,10 @@ var/mob/living/L = target if(!L.anchored) L.visible_message("[L] is snagged by [firer]'s hook!") + var/old_density = L.density + L.density = FALSE // Ensures the hook does not hit the target multiple times L.forceMove(get_turf(firer)) + L.density = old_density /obj/item/projectile/hook/Destroy() QDEL_NULL(chain) From 15522dae9e52f43e41696315f93e67dc76e857a6 Mon Sep 17 00:00:00 2001 From: Aidenzack1 <65001885+Aidenzack1@users.noreply.github.com> Date: Tue, 21 Jul 2020 02:34:54 -0700 Subject: [PATCH 047/111] fixes certain items unable to light plasma sheets (#13871) * fixes certain items unable to light plasma sheets fixes matches, lighters, and candles from being unable to properly light plasma sheets on fire * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm * Update mineral.dm --- .../objects/items/stacks/sheets/mineral.dm | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 54d42176f52..9dabea08319 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -218,10 +218,22 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ /obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I) if(I.use_tool(src, user, volume = I.tool_volume)) - message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1) - log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])") - investigate_log("was ignited by [key_name(user)]","atmos") - fire_act() + log_and_set_aflame(user, I) + return TRUE + +/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params) + if(is_hot(I)) + log_and_set_aflame(user, I) + else + return ..() + +/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I) + var/turf/T = get_turf(src) + message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]") + log_game("Plasma sheets ignited by [key_name(user)] in [COORD(T)]") + investigate_log("was ignited by [key_name(user)]", "atmos") + user.create_log(MISC_LOG, "Plasma sheets ignited using [I]", src) + fire_act() /obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() From 402318624d68b941703a61f3a44252bc3d4e8dd7 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:35:40 +0100 Subject: [PATCH 048/111] Fixes sparks not checking for deletion (#13872) * Fixes sparks not checking for deletion * Tweaks --- code/game/objects/effects/effect_system/effect_system.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 5ae6b0c6860..9ae89309eed 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -49,6 +49,8 @@ would spawn and follow the beaker, even if it is carried or thrown. holder = atom /datum/effect_system/proc/start() + if(QDELETED(src)) + return for(var/i in 1 to number) if(total_effects > 20) return @@ -68,7 +70,8 @@ would spawn and follow the beaker, even if it is carried or thrown. for(var/j in 1 to steps_amt) sleep(5) step(E,direction) - addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) + if(!QDELETED(src)) + addtimer(CALLBACK(src, .proc/decrement_total_effect), 20) /datum/effect_system/proc/decrement_total_effect() total_effects-- From 7e965624b42ffcc6b8340c99322e6f2b14912764 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:38:06 +0100 Subject: [PATCH 049/111] Fixes null mind runtimes with roasry nullrod (#13875) --- code/game/objects/items/weapons/holy_weapons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 4efb6994e8d..6423bbeb6ff 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -488,7 +488,7 @@ var/mob/living/carbon/human/holder = loc if(src == holder.l_hand || src == holder.r_hand) // Holding this in your hand will for(var/mob/living/carbon/human/H in range(5, loc)) - if(H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) + if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full)) H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2) if(prob(10)) to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!") From 55387c7927ff2fa3ef83f29d0c92c196beb5c074 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:38:24 +0100 Subject: [PATCH 050/111] Adds appropriate attribution to nanomap rendering (#13878) --- tools/github-actions/README.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/github-actions/README.MD b/tools/github-actions/README.MD index 342dcbf3585..74b31f5bdd6 100644 --- a/tools/github-actions/README.MD +++ b/tools/github-actions/README.MD @@ -2,5 +2,5 @@ This folder contains all the script and tools required for GitHub actions. If you add something to this directory, **PLEASE** document it in here -- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically +- `nanomap-renderer` - A linux application to render NanoMap images of the ingame maps automatically. Based off of SpacemanDMM (Modified source [here](https://github.com/AffectedArc07/ParaSpacemanDMM), original source [here](https://github.com/Spacemaniac/SpacemanDMM)) - `nanomap-renderer-invoker.sh` - A script which invokes the render tool and clones the maps to the correct directory From 79bd10034a23dfe785abc3a0408e57de24d809d4 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 10:40:26 +0100 Subject: [PATCH 051/111] Tcomms fixes and tweaks (#13880) * Tcomms fixes and tweaks * Grammar --- code/game/machinery/tcomms/_base.dm | 32 +++++++++++++++++++++++++++++ code/game/machinery/tcomms/core.dm | 1 + code/game/machinery/tcomms/relay.dm | 1 + 3 files changed, 34 insertions(+) diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index dc933099faa..05c7552aacc 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -52,6 +52,19 @@ GLOBAL_LIST_EMPTY(tcomms_machines) . = ..() GLOB.tcomms_machines += src update_icon() + if((!mapload) && (usr)) + // To the person who asks "Hey affected, why are you using this massive operator when you can use AREACOORD?" Well, ill tell you + // get_area_name is fucking broken and uses a for(x in world) search + // It doesnt even work, is expensive, and returns 0 + // Im not refactoring one thing which could risk breaking all admin location logs + // Fight me + log_action(usr, "constructed a new [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) + // Add in component parts for the sake of deconstruction + component_parts = list() + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/stack/cable_coil(null, 1) /** * Base Destructor @@ -60,6 +73,8 @@ GLOBAL_LIST_EMPTY(tcomms_machines) */ /obj/machinery/tcomms/Destroy() GLOB.tcomms_machines -= src + if(usr) + log_action(usr, "destroyed a [src] at [src ? "[get_location_name(src, TRUE)] [COORD(src)]" : "nonexistent location"] [ADMIN_JMP(src)]", adminmsg = TRUE) return ..() /** @@ -462,3 +477,20 @@ GLOBAL_LIST_EMPTY(tcomms_machines) break return ..() +/** + * Screwdriver Act Handler + * + * Handles the screwdriver action for all tcomms machines, so they can be open and closed to be deconstructed + */ +/obj/machinery/tcomms/screwdriver_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_screwdriver(user, icon_state, icon_state, I) + +/** + * Crowbar Act Handler + * + * Handles the crowbar action for all tcomms machines, so they can be deconstructed + */ +/obj/machinery/tcomms/crowbar_act(mob/user, obj/item/I) + . = TRUE + default_deconstruction_crowbar(user, I) diff --git a/code/game/machinery/tcomms/core.dm b/code/game/machinery/tcomms/core.dm index 88846a5de33..46cd0e6df71 100644 --- a/code/game/machinery/tcomms/core.dm +++ b/code/game/machinery/tcomms/core.dm @@ -34,6 +34,7 @@ . = ..() link_password = GenerateKey() reachable_zlevels |= loc.z + component_parts += new /obj/item/circuitboard/tcomms/core(null) /** * Destructor for the core. diff --git a/code/game/machinery/tcomms/relay.dm b/code/game/machinery/tcomms/relay.dm index 2cd2a44b1af..b2faf9ce0cd 100644 --- a/code/game/machinery/tcomms/relay.dm +++ b/code/game/machinery/tcomms/relay.dm @@ -25,6 +25,7 @@ */ /obj/machinery/tcomms/relay/Initialize(mapload) . = ..() + component_parts += new /obj/item/circuitboard/tcomms/relay(null) if(mapload && autolink_id) return INITIALIZE_HINT_LATELOAD From f1dbb39f87861963fe9f334f441bc7643ceaf872 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 12:09:07 +0200 Subject: [PATCH 052/111] Gives thralls their actual masters name in the description (#13885) --- code/game/gamemodes/vampire/vampire_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 7e0f00f8721..07c61628337 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -354,10 +354,10 @@ var/datum/objective/protect/serve_objective = new serve_objective.owner = user.mind serve_objective.target = H.mind - serve_objective.explanation_text = "You have been Enthralled by [user]. Follow [user.p_their()] every command." + serve_objective.explanation_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." H.mind.objectives += serve_objective - to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.") + to_chat(H, "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command.") to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.") H.Stun(2) add_attack_logs(user, H, "Vampire-thralled") From 92633a4ec313862a266fad832822cd40c2fd7419 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 21 Jul 2020 16:40:50 +0100 Subject: [PATCH 053/111] Removes REACHABLE flag from lavaland --- _maps/cyberiad.dm | 2 +- _maps/delta.dm | 2 +- _maps/metastation.dm | 2 +- code/game/turfs/space/transit.dm | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 81499ec8c75..644869502b4 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -17,7 +17,7 @@ z4 = lavaland #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/cyberiad #elif !defined(MAP_OVERRIDE) diff --git a/_maps/delta.dm b/_maps/delta.dm index cf6acbcddb1..159fd8b01b3 100644 --- a/_maps/delta.dm +++ b/_maps/delta.dm @@ -22,7 +22,7 @@ Lovingly ported by Purpose2 to Paradise #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/delta diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 7747ad79fb8..03ba531f932 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -23,7 +23,7 @@ z7 = empty space #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(REACHABLE, STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) #define USING_MAP_DATUM /datum/map/metastation diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index a96cbae1269..8e0dedbdd44 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -94,8 +94,6 @@ var/max = world.maxx-TRANSITIONEDGE var/min = 1+TRANSITIONEDGE - var/_z = pick(levels_by_trait(REACHABLE)) //select a random space zlevel - //now select coordinates for a border turf var/_x var/_y @@ -113,7 +111,8 @@ _x = rand(min,max) _y = min - var/turf/T = locate(_x, _y, _z) + var/list/levels_available = levels_by_trait(REACHABLE) + var/turf/T = locate(_x, _y, pick(levels_available)) AM.forceMove(T) AM.newtonian_move(dir) From cdc762975c203d04836c300cc54b1469debcc1e6 Mon Sep 17 00:00:00 2001 From: farie82 Date: Tue, 21 Jul 2020 22:43:24 +0200 Subject: [PATCH 054/111] Makes for loops use GLOB.human_list. Should improve performance a bit. Fixes blood contract affecting dead crew (#13691) * Replaces all human in X to GLOB.human_list * crew monitor * no playerlist converts * forgot to stage there... --- code/__HELPERS/mobs.dm | 3 ++- code/controllers/subsystem/afk.dm | 3 ++- code/datums/diseases/advance/advance.dm | 5 +++-- code/game/gamemodes/game_mode.dm | 9 ++++++--- code/game/gamemodes/nuclear/pinpointer.dm | 3 ++- code/game/gamemodes/revolution/revolution.dm | 6 ++++-- code/game/gamemodes/scoreboard.dm | 6 ++++-- code/game/gamemodes/wizard/artefact.dm | 5 +++-- code/game/objects/effects/manifest.dm | 3 ++- code/modules/admin/topic.dm | 18 ++++++++++++------ code/modules/admin/verbs/debug.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 6 ++++-- code/modules/events/mass_hallucination.dm | 5 ++++- code/modules/flufftext/Hallucination.dm | 14 +++++++++----- .../mining/lavaland/loot/bubblegum_loot.dm | 2 +- code/modules/tgui/modules/crew_monitor.dm | 2 +- 16 files changed, 60 insertions(+), 32 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f7c66c3378b..a38eeb99ced 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -579,7 +579,8 @@ GLOBAL_LIST_INIT(do_after_once_tracker, list()) LogMouseMacro(".mouse", params) /proc/update_all_mob_security_hud() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing H.sec_hud_set_security_status() /proc/getviewsize(view) diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm index 951a7fb1786..25ccda3349c 100644 --- a/code/controllers/subsystem/afk.dm +++ b/code/controllers/subsystem/afk.dm @@ -21,7 +21,8 @@ SUBSYSTEM_DEF(afk) /datum/controller/subsystem/afk/fire() var/list/toRemove = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!H?.ckey) // Useless non ckey creatures continue diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 34c41c581f2..318dd176e45 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -395,8 +395,9 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/AD in GLOB.active_diseases) AD.Refresh() - for(var/mob/living/carbon/human/H in shuffle(GLOB.alive_mob_list)) - if(!is_station_level(H.z)) + for(var/thing in shuffle(GLOB.human_list)) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || !is_station_level(H.z)) continue if(!H.HasDisease(D)) H.ForceContractDisease(D) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2d71df8c979..57a77167346 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -291,7 +291,8 @@ /////////////////////////////////// /datum/game_mode/proc/get_living_heads() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing var/list/real_command_positions = GLOB.command_positions.Copy() - "Nanotrasen Representative" if(player.stat != DEAD && player.mind && (player.mind.assigned_role in real_command_positions)) . |= player.mind @@ -312,7 +313,8 @@ ////////////////////////////////////////////// /datum/game_mode/proc/get_living_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind @@ -321,7 +323,8 @@ //////////////////////////////////////// /datum/game_mode/proc/get_all_sec() . = list() - for(var/mob/living/carbon/human/player in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind && (player.mind.assigned_role in GLOB.security_positions)) . |= player.mind diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index e8f4c22e377..f6e454bd737 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -357,7 +357,8 @@ var/list/name_counts = list() var/list/names = list() - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!trackable(H)) continue diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index b09bb7a851f..213814d52e8 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -385,7 +385,8 @@ if(foecount == GLOB.score_arrested) GLOB.score_allarrested = 1 - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) @@ -415,7 +416,8 @@ for(var/datum/mind/M in SSticker.mode:revolutionaries) if(M.current && M.current.stat != DEAD) revcount++ - for(var/mob/living/carbon/human/player in GLOB.mob_living_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/player = thing if(player.mind) var/role = player.mind.assigned_role if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index d9e59e9ded1..2e370db5f7a 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -41,7 +41,8 @@ GLOB.score_deadaipenalty++ GLOB.score_deadcrew++ - for(var/mob/living/carbon/human/I in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/I = thing if(I.stat == DEAD && is_station_level(I.z)) GLOB.score_deadcrew++ @@ -60,7 +61,8 @@ var/dmg_score = 0 if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) - for(var/mob/living/carbon/human/E in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/E = thing cash_score = 0 dmg_score = 0 var/turf/location = get_turf(E.loc) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 09b228bdd0c..a81b12ed041 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -866,8 +866,9 @@ GLOBAL_LIST_EMPTY(multiverse) possible = list() if(!link) return - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(md5(H.dna.uni_identity) in link.fingerprints) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD && (md5(H.dna.uni_identity) in link.fingerprints)) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index f267494496e..6ada54e75f7 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -10,7 +10,8 @@ /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" - for(var/mob/living/carbon/human/M in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/M = thing dat += text(" [] - []
", M.name, M.get_assignment()) var/obj/item/paper/P = new /obj/item/paper( src.loc ) P.info = dat diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 50fa99778e7..19bbc40ba25 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2583,14 +2583,16 @@ if("monkey") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.monkeyize() ok = 1 if("corgi") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","M") - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing spawn(0) H.corgize() ok = 1 @@ -2661,7 +2663,8 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","PW") message_admins("[key_name_admin(usr)] teleported all players to the prison station.", 1) - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing var/turf/loc = find_loc(H) var/security = 0 if(!is_station_level(loc.z) || GLOB.prisonwarped.Find(H)) @@ -2994,7 +2997,8 @@ if("manifest") var/dat = "Showing Crew Manifest.


" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) dat += text("", H.name, H.get_assignment()) dat += "
NamePosition
[][]
" @@ -3004,7 +3008,8 @@ if("DNA") var/dat = "Showing DNA from blood.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.dna && H.ckey) dat += "" dat += "
NameDNABlood Type
[H][H.dna.unique_enzymes][H.dna.blood_type]
" @@ -3012,7 +3017,8 @@ if("fingerprints") var/dat = "Showing Fingerprints.
" dat += "" - for(var/mob/living/carbon/human/H in GLOB.mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.ckey) if(H.dna && H.dna.uni_identity) dat += "" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 424e3c91f57..43db66cabc5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -643,7 +643,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) for(var/areatype in areas_without_camera) to_chat(world, "* [areatype]") -/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in GLOB.mob_list) +/client/proc/cmd_admin_dress(mob/living/carbon/human/M in GLOB.human_list) set category = "Event" set name = "Select equipment" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 03315243602..9b7cde2abdd 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -979,7 +979,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/role_string var/obj_count = 0 var/obj_string = "" - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(!isLivingSSD(H)) continue mins_ssd = round((world.time - H.last_logout) / 600) @@ -1016,7 +1017,8 @@ Traitors and the like can also be revived with the previous role mostly intact. msg += "AFK Players:
NameFingerprints
[H][md5(H.dna.uni_identity)]
" msg += "" var/mins_afk - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.client == null || H.stat == DEAD) // No clientless or dead continue mins_afk = round(H.client.inactivity / 600) diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 196642ce39c..b8bde0a1a67 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -2,7 +2,10 @@ announceWhen = rand(0, 20) /datum/event/mass_hallucination/start() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD) + continue var/armor = H.getarmor(type = "rad") if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected continue diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 51ac13d4e13..905b629a0b9 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -460,8 +460,9 @@ Gunshots/explosions/opening doors/less rare audio (done) target = T var/image/A = null var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon","zombie") - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H == target) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat == DEAD || H == target) continue if(skip_nearby && (H in view(target))) continue @@ -539,7 +540,8 @@ Gunshots/explosions/opening doors/less rare audio (done) var/mob/living/carbon/human/clone = null var/clone_weapon = null - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing if(H.stat || H.lying) continue clone = H @@ -751,8 +753,10 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/projectile, /obj/ite target.client.images.Remove(speech_overlay) else // Radio talk var/list/humans = list() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - humans += H + for(var/thing in GLOB.human_list) + var/mob/living/carbon/human/H = thing + if(H.stat != DEAD) + humans += H person = pick(humans) target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") qdel(src) diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm index fa7791edb9e..4ee2c76a419 100644 --- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -82,7 +82,7 @@ B.mineEffect(L) for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H == L) + if(H.stat == DEAD || H == L) continue to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!") H.put_in_hands(new /obj/item/kitchen/knife/butcher(H)) diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index f0d164df7c6..f1da4ed89ba 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -14,7 +14,7 @@ if("track") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.mob_list + var/mob/living/carbon/human/H = locate(params["track"]) in GLOB.human_list if(hassensorlevel(H, SUIT_SENSOR_TRACKING)) AI.ai_actual_track(H) return TRUE From f29114f3d69869b69191d213a55bd13390551e2f Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Tue, 21 Jul 2020 20:45:35 +0000 Subject: [PATCH 055/111] Terror spider event types now depend on server pop (#13874) * Terror spider events now depend on server pop * split off from PR 13657 * farie suggestion * convert var/highpop_trigger to #define TS_HIGHPOP_TRIGGER * newline * re-run mapdiffbot Co-authored-by: Kyep --- code/modules/events/spider_terror.dm | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index 75b86d20cb0..79acc49fe73 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -1,3 +1,4 @@ +#define TS_HIGHPOP_TRIGGER 80 /datum/event/spider_terror announceWhen = 240 @@ -22,23 +23,32 @@ if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent var/spider_type - var/infestation_type = pick(1, 2, 3, 4, 5) + var/infestation_type + if((length(GLOB.clients)) < TS_HIGHPOP_TRIGGER) + infestation_type = pick(1, 2, 3, 4) + else + infestation_type = pick(2, 3, 4, 5) switch(infestation_type) if(1) + // Weakest, only used during lowpop. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green spawncount = 5 if(2) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white - spawncount = 2 - if(3) + // Fairly weak. Dangerous in single combat but has little staying power. Always gets whittled down. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince spawncount = 1 + if(3) + // Variable. Depends how many they infect. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white + spawncount = 2 if(4) - spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen - spawncount = 1 - if(5) + // Pretty strong. spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/princess spawncount = 2 + if(5) + // Strongest, only used during highpop. + spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen + spawncount = 1 while(spawncount >= 1 && vents.len) var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents) @@ -60,3 +70,6 @@ new spider_type(vent.loc) spawncount-- + +#undef TS_HIGHPOP_TRIGGER + From 1f99c6d5847f3a213d90e9f1391fd62742f9b4d6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 22 Jul 2020 18:50:25 +0100 Subject: [PATCH 056/111] Makes it work better --- _maps/cyberiad.dm | 2 +- _maps/delta.dm | 2 +- _maps/metastation.dm | 2 +- code/game/turfs/space/transit.dm | 2 +- code/modules/space_management/level_traits.dm | 13 +++++++++++++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 644869502b4..3652328e8f4 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -17,7 +17,7 @@ z4 = lavaland #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/cyberiad #elif !defined(MAP_OVERRIDE) diff --git a/_maps/delta.dm b/_maps/delta.dm index 159fd8b01b3..f944092131b 100644 --- a/_maps/delta.dm +++ b/_maps/delta.dm @@ -22,7 +22,7 @@ Lovingly ported by Purpose2 to Paradise #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/delta diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 03ba531f932..0941ffc453a 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -23,7 +23,7 @@ z7 = empty space #define MAP_TRANSITION_CONFIG list(\ DECLARE_LEVEL(MAIN_STATION, CROSSLINKED, list(STATION_LEVEL, STATION_CONTACT, REACHABLE, AI_OK)),\ DECLARE_LEVEL(CENTCOMM, SELFLOOPING, list(ADMIN_LEVEL, BLOCK_TELEPORT, IMPEDES_MAGIC)),\ -DECLARE_LEVEL(MINING, SELFLOOPING, list(STATION_CONTACT, HAS_WEATHER, ORE_LEVEL, AI_OK))) +DECLARE_LEVEL(MINING, SELFLOOPING, list(ORE_LEVEL, REACHABLE, STATION_CONTACT, HAS_WEATHER, AI_OK))) #define USING_MAP_DATUM /datum/map/metastation diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 8e0dedbdd44..dda49fecdbd 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -111,7 +111,7 @@ _x = rand(min,max) _y = min - var/list/levels_available = levels_by_trait(REACHABLE) + var/list/levels_available = get_all_linked_levels_zpos() var/turf/T = locate(_x, _y, pick(levels_available)) AM.forceMove(T) AM.newtonian_move(dir) diff --git a/code/modules/space_management/level_traits.dm b/code/modules/space_management/level_traits.dm index 1d88f70454f..6aa3fa802a7 100644 --- a/code/modules/space_management/level_traits.dm +++ b/code/modules/space_management/level_traits.dm @@ -61,3 +61,16 @@ GLOBAL_LIST_INIT(default_map_traits, MAP_TRANSITION_CONFIG) /proc/level_name_to_num(name) var/datum/space_level/S = GLOB.space_manager.get_zlev_by_name(name) return S.zpos + +/** + * Proc to get a list of all the linked-together Z-Levels + * + * Returns a list of zlevel numbers which can be accessed from travelling space naturally + */ +/proc/get_all_linked_levels_zpos() + var/list/znums = list() + for(var/i in GLOB.space_manager.z_list) + var/datum/space_level/SL = GLOB.space_manager.z_list[i] + if(SL.linkage == CROSSLINKED) + znums |= SL.zpos + return znums From a0e07dd41abf80d60ebdb30ee6323f3bf76f3970 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 23 Jul 2020 02:43:20 -0700 Subject: [PATCH 057/111] SM & TEG cargo crate appearance --- code/datums/supplypacks.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index c8045dfe1e4..5b21036b2bc 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -633,7 +633,6 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY contains = list(/obj/machinery/power/emitter, /obj/machinery/power/emitter) cost = 10 - containertype = /obj/structure/closet/crate/secure containername = "emitter crate" access = ACCESS_CE containertype = /obj/structure/closet/crate/secure/engineering @@ -717,7 +716,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY name = "Supermatter Shard Crate" contains = list(/obj/machinery/power/supermatter_shard) cost = 50 //So cargo thinks twice before killing themselves with it - containertype = /obj/structure/closet/crate/secure + containertype = /obj/structure/closet/crate/secure/engineering containername = "supermatter shard crate" access = ACCESS_CE @@ -728,7 +727,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY /obj/item/pipe/circulator, /obj/item/pipe/circulator) cost = 25 - containertype = /obj/structure/closet/crate/secure + containertype = /obj/structure/closet/crate/secure/engineering containername = "thermo-electric generator crate" access = ACCESS_CE announce_beacons = list("Engineering" = list("Chief Engineer's Desk", "Atmospherics")) From 0dc49ded78d925d66c32830d4236f5e91cb6154a Mon Sep 17 00:00:00 2001 From: Deelite34 Date: Thu, 23 Jul 2020 12:20:04 +0200 Subject: [PATCH 058/111] Update text.dm Fixes 13865 --- code/__HELPERS/text.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index ecbebf813df..47650177283 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -533,7 +533,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[/grid\]", "
KeyReal NameJobMins AFKSpecial RoleAreaPPNCryo
") text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") - text = replacetext(text, "\[logo\]", "") + text = replacetext(text, "\[logo\]", "​") text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO if(!no_font) if(P) From 70cc32824b47e142f3b2a4af6f6336b41c00f71d Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 23 Jul 2020 11:33:24 +0100 Subject: [PATCH 059/111] Adds book DRM --- code/modules/library/lib_machines.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 8fa7629863e..67c034e6039 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -150,6 +150,10 @@ GLOBAL_LIST_INIT(library_section_names, list("Any", "Fiction", "Non-Fiction", "A power_change() return if(istype(I, /obj/item/book)) + // NT with those pesky DRM schemes + if(istype(I, /obj/item/book/manual)) + atom_say("NT copyrighted material detected. Scanner is unable to copy book to memory.") + return FALSE user.drop_item() I.forceMove(src) return 1 From 1c1b4fa8c7733b98702fe4f0706000d8abf2ad72 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 23 Jul 2020 12:42:28 +0100 Subject: [PATCH 060/111] Makes book DRM apply to printed books --- code/game/objects/items/weapons/manuals.dm | 1 + code/modules/library/computers/checkout.dm | 1 + code/modules/library/lib_items.dm | 2 ++ code/modules/library/lib_machines.dm | 5 +++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index d91bb29ff76..bab2ff02fbb 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/library.dmi' due_date = 0 // Game time in 1/10th seconds unique = 1 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified + has_drm = TRUE // No reuploading. Piracy is a crime /obj/item/book/manual/engineering_construction diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm index f9aae71b2a5..934234f645e 100644 --- a/code/modules/library/computers/checkout.dm +++ b/code/modules/library/computers/checkout.dm @@ -463,4 +463,5 @@ B.author = newbook.author B.dat = newbook.content B.icon_state = "book[rand(1,16)]" + B.has_drm = TRUE visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?") diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a7dd148b51a..e74625c8715 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -151,6 +151,8 @@ var/carved = 0 // Has the book been hollowed out for use as a secret storage item? var/forbidden = 0 // Prevent ordering of this book. (0=no, 1=yes, 2=emag only) var/obj/item/store // What's in the book? + /// Book DRM. If this var is TRUE, it cannot be scanned and re-uploaded + var/has_drm = FALSE /obj/item/book/attack_self(var/mob/user as mob) if(carved) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 67c034e6039..0c23a0c5800 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -151,8 +151,9 @@ GLOBAL_LIST_INIT(library_section_names, list("Any", "Fiction", "Non-Fiction", "A return if(istype(I, /obj/item/book)) // NT with those pesky DRM schemes - if(istype(I, /obj/item/book/manual)) - atom_say("NT copyrighted material detected. Scanner is unable to copy book to memory.") + var/obj/item/book/B = I + if(B.has_drm) + atom_say("Copyrighted material detected. Scanner is unable to copy book to memory.") return FALSE user.drop_item() I.forceMove(src) From 4a7f85177616031d38c99ce1d099c4b35fc3c44c Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 23 Jul 2020 04:53:08 -0700 Subject: [PATCH 061/111] Fixes admin call shuttle verb ignoring alert status --- code/modules/admin/verbs/randomverbs.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9b7cde2abdd..a65884369a1 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -826,7 +826,10 @@ Traitors and the like can also be revived with the previous role mostly intact. else SSshuttle.emergency.canRecall = FALSE - SSshuttle.emergency.request() + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) + SSshuttle.emergency.request(coefficient = 0.5, redAlert = TRUE) + else + SSshuttle.emergency.request() feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") From cf5c8182dcbc0f78e387bdd4aab5602132dd4ca2 Mon Sep 17 00:00:00 2001 From: Mitchell Date: Fri, 24 Jul 2020 02:39:21 -0500 Subject: [PATCH 062/111] Emotional --- code/modules/mob/living/carbon/human/emote.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 10c2ac8f119..b69c13987b9 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -308,14 +308,14 @@ m_type = 1 if("bow", "bows") - if(!buckled) + if(!restrained()) var/M = handle_emote_param(param) message = "[src] bows[M ? " to [M]" : ""]." m_type = 1 if("salute", "salutes") - if(!buckled) + if(!restrained()) var/M = handle_emote_param(param) message = "[src] salutes[M ? " to [M]" : ""]." From f219ea5e0313d28068de42c1c74452b9d88a7137 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Fri, 24 Jul 2020 14:53:52 +0200 Subject: [PATCH 063/111] Removes dead link --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2c0ababbe30..b484a8bccfc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Build Status](https://travis-ci.org/ParadiseSS13/Paradise.svg?branch=master)](https://travis-ci.org/ParadiseSS13/Paradise) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/paradisess13/paradise.svg)](http://isitmaintained.com/project/paradisess13/paradise "Percentage of issues still open") -[![Krihelimeter](http://www.krihelinator.xyz/badge/paradisess13/paradise)](http://www.krihelinator.xyz) ![Render Nanomaps](https://github.com/ParadiseSS13/Paradise/workflows/Render%20Nanomaps/badge.svg) [![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](http://forthebadge.com) From 6085508428937f42d53bbde7c6feb141897168e6 Mon Sep 17 00:00:00 2001 From: mochi Date: Fri, 24 Jul 2020 18:33:15 +0200 Subject: [PATCH 064/111] Fix lipsticks --- code/game/objects/items/weapons/cosmetics.dm | 60 ++++++++++-------- .../mob/living/carbon/human/update_icons.dm | 8 +-- icons/mob/human_face.dmi | Bin 2480 -> 2134 bytes icons/obj/items.dmi | Bin 152592 -> 152591 bytes 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 8815ad6a20f..42f65141094 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -5,16 +5,22 @@ icon_state = "lipstick" w_class = WEIGHT_CLASS_TINY var/colour = "red" - var/open = 0 - var/list/lipstick_colors = list( - "purple" = "purple", - "jade" = "#216F43", - "lime" = "lime", - "black" = "black", - "green" = "green", - "blue" = "blue", - "white" = "white") + var/open = FALSE + var/static/list/lipstick_colors +/obj/item/lipstick/Initialize(mapload) + . = ..() + if(!lipstick_colors) + lipstick_colors = list( + "black" = "#000000", + "white" = "#FFFFFF", + "red" = "#FF0000", + "green" = "#00C000", + "blue" = "#0000FF", + "purple" = "#D55CD0", + "jade" = "#216F43", + "lime" = "#00FF00", + ) /obj/item/lipstick/purple name = "purple lipstick" @@ -22,7 +28,7 @@ /obj/item/lipstick/jade name = "jade lipstick" - colour = "#216F43" + colour = "jade" /obj/item/lipstick/lime name = "lime lipstick" @@ -47,40 +53,38 @@ /obj/item/lipstick/random name = "lipstick" -/obj/item/lipstick/random/New() - ..() - var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var. - colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) - name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon +/obj/item/lipstick/random/Initialize(mapload) + . = ..() + var/lscolor = pick(lipstick_colors) // A random color is picked from the var defined initially in a new var. + colour = lipstick_colors[lscolor] // The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) + name = "[lscolor] lipstick" // The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon - -/obj/item/lipstick/attack_self(mob/user as mob) - overlays.Cut() +/obj/item/lipstick/attack_self(mob/user) + cut_overlays() to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") open = !open if(open) - var/image/colored = image("icon"='icons/obj/items.dmi', "icon_state"="lipstick_uncap_color") - colored.color = colour + var/image/colored = mutable_appearance('icons/obj/items.dmi', "lipstick_uncap_color") + colored.color = lipstick_colors[colour] icon_state = "lipstick_uncap" - overlays += colored + add_overlay(colored) else icon_state = "lipstick" -/obj/item/lipstick/attack(mob/M as mob, mob/user as mob) - if(!open) return - - if(!istype(M, /mob)) return +/obj/item/lipstick/attack(mob/M, mob/user) + if(!open || !istype(M)) + return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.lip_style) //if they already have lipstick on + if(H.lip_style) // If they already have lipstick on to_chat(user, "You need to wipe off the old lipstick first!") return if(H == user) user.visible_message("[user] does [user.p_their()] lips with [src].", \ "You take a moment to apply [src]. Perfect!") H.lip_style = "lipstick" - H.lip_color = colour + H.lip_color = lipstick_colors[colour] H.update_body() else user.visible_message("[user] begins to do [H]'s lips with \the [src].", \ @@ -89,7 +93,7 @@ user.visible_message("[user] does [H]'s lips with \the [src].", \ "You apply \the [src].") H.lip_style = "lipstick" - H.lip_color = colour + H.lip_color = lipstick_colors[colour] H.update_body() else to_chat(user, "Where are the lips on that?") diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 81907ba516f..1f38e564928 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -273,10 +273,10 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER) apply_overlay(UNDERWEAR_LAYER) - if(lip_style && (LIPS in dna.species.species_traits)) - var/icon/lips = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "lips_[lip_style]_s") - lips.Blend(lip_color, ICON_ADD) - standing += mutable_appearance(lips, layer = -BODY_LAYER) + if(lip_style && (LIPS in dna.species.species_traits)) + var/mutable_appearance/lips = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]_s") + lips.color = lip_color + standing += lips overlays_standing[BODY_LAYER] = standing apply_overlay(BODY_LAYER) diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index ff471760fe86b052d9161ba7b44fb9beb61036a3..9b6d9468b9dfd8f5a113ed33b0a485172ac7e492 100644 GIT binary patch literal 2134 zcmb_eYcLy#7EUaZ>I$|x>RoDeRbRW>B3`B5n#N6qqSmTM>yb!>c#Df$-9>2yyN$-} zuE%a-g;EqrP;IJ0+NhPv29Y*OBep~u(j=QZ_y7HI$B%Q)%$YN1&V1*5^PTTQF9hi8 zndt!l0R5mqUxX$u{>Q+&8gF(iMW6|Td103_eG{?q8OfN;xV;8=!N?s&fi4s%um-|9#(#6kN)*;6w0`)!SocN zt^4_Wno!#e9Z?4x6B^^oeJi!iHXyXqcPOk3!xy3CG_c$jsNdivx{kYngSPh6+MT-f zPh9P_CpsIRNVi^>wk6bdGlESyz^3?0V#p1r7ty+62b;Lx_C9lJDHzi=&OS*i4v6-i zd9}K?Xy5&WmN5q?000UP^7RhOXsU- zsv`l0lC;VW0)1)#Hi5;4c4xs~9Ms-pSfUN~-tBZxH!vJIlbIen=viGFPj@XH=$OV9 zAEuDWuI}zf7wCoNJsX~LwaH?^;c(*Xv~bD#I(|^CQqfsS-5Y|(CLwrEn|$~ydezWYuMRMh=iJfh%%8yZ5{mZH0g3fEbtm$ zAFqPt8UaT;=C&_}auavug7D3UhtXzL{tQ|00Z2Iw@2kd|;qSSEYg(%Oe`zI?GccIY z*6C!^Dt}m$QKkPcBC)vreA~1pZD`6+Y*L*-ZT~)+__CBrCaWWjdR>d0=_{F0Q&UrU zmUz{2>{W=?oAChyx>Bk1{@7a$HhI!;6H_FXxwLQ4w4Wj7K>V~bsRMl=5QtXE_=+y; zJyG$LG?_Gc1n!fnBbV^q%+KMZ*WK?h3tTK99aO4`E~c=MwpC&CSbzzg-5Ld~4oKFn zu+G5&6xN8U_$W#h)>$nVG1uvk_fB-&C%?8)iUlabJNJQ1y4qE7koWn0OJP^V*}{MI z|K(Kg{7rFDUaCr_{`JeZ`EFV za`nL;+yuD>`Ss8KPfp{)kw`c7xY!YY{9UUoAbN&aTN^7}sAAIA4L&wLg|lotijc@j zX0>$)5($f$rCFL%Fc3cGbXESO=$Vm2ILSavI}ZfstX#&J$HX^@&i z5k(Pn$t=$*-#i?uqkLo%eUV+u^Fx3Q;fQKhmvkW(z+oqP7nY(S^j!CB^lEg1Vd38Go*dM&R(0 z{|f2iI9y99eY)JNxSPtOpd<3<9%W``dC{>iG3D)TNGQmRcO>q?INwZP9>YPOV5m*%WtMh!Gi`5B;>wp$g;Le z&|v|_#RUpA({SU#JK4h_h_sSz-(H|MhYobXE6gHwBJ1>_vxFkYV!o))re4YozPdjl zQtL7&o^r3QCUFl2_N}@LLIv79)9bgVSikSo@~PSXzl6dueQE;{hO8rLQGfhzq50lU zGFh~_%#KzEj&*EB$LR3Y4bkf_wyvK4F_N2Xv9`2UDI#Hb;H u<1WSz=mm2q>Z%;zoi|6m+69T)G4S-a(+4o{^_oWk5af5kx5MYVlD`4lQn~E_ literal 2480 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 Rp}ztE7Yr|-FFNZG@*hhxjMe}E delta 21350 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 From 061c5be0ba4786e168f3204e9e29eaeae802e1d6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Fri, 24 Jul 2020 18:36:19 +0100 Subject: [PATCH 065/111] Makes it so all space ruins are correctly mapped --- .../RandomRuins/SpaceRuins/asteroid1.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid2.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid3.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid4.dmm | 4 +- .../RandomRuins/SpaceRuins/asteroid5.dmm | 4 +- .../RandomRuins/SpaceRuins/deepstorage.dmm | 4 +- .../RandomRuins/SpaceRuins/derelict1.dmm | 8 +-- .../RandomRuins/SpaceRuins/derelict2.dmm | 12 ++-- .../RandomRuins/SpaceRuins/derelict3.dmm | 8 +-- .../RandomRuins/SpaceRuins/derelict4.dmm | 4 +- .../RandomRuins/SpaceRuins/derelict5.dmm | 4 +- .../RandomRuins/SpaceRuins/emptyshell.dmm | 8 +-- .../RandomRuins/SpaceRuins/gasthelizards.dmm | 8 +-- .../SpaceRuins/intactemptyship.dmm | 12 ++-- .../RandomRuins/SpaceRuins/listeningpost.dmm | 4 +- .../RandomRuins/SpaceRuins/mechtransport.dmm | 10 ++-- .../RandomRuins/SpaceRuins/onehalf.dmm | 58 +++++++++---------- .../RandomRuins/SpaceRuins/spacebar.dmm | 4 +- .../SpaceRuins/turretedoutpost.dmm | 6 +- .../RandomRuins/SpaceRuins/way_home.dmm | 4 +- .../RandomRuins/SpaceRuins/wizardcrash.dmm | 4 +- 21 files changed, 89 insertions(+), 89 deletions(-) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm index 5dae1cf1452..de19f1ecbc8 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm index aace1d84625..6a90a5dd587 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm index a569b957ebf..121b5cff321 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm index fb51d7aabc1..fb1039beb6f 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm index aae4ff9e9c7..d7f38907b30 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index 8bb87d2026e..7d0db9f8eb3 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/mineral/random/low_chance, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm index 8b094749545..a78a8e88151 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm index 95ad761e62c..f3b7a74c0b3 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm @@ -1,14 +1,14 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/window/reinforced{ tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "c" = ( /obj/machinery/door/airlock/external, @@ -20,7 +20,7 @@ icon_state = "rwindow"; dir = 8 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "e" = ( /obj/structure/window/reinforced{ @@ -64,7 +64,7 @@ /area/ruin/powered) "k" = ( /obj/structure/window/reinforced, -/turf/space, +/turf/template_noop, /area/space/nearstation) "l" = ( /obj/structure/window/reinforced, @@ -112,7 +112,7 @@ icon_state = "rwindow"; dir = 1 }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "q" = ( /obj/machinery/light/small{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm index be313cd7770..56cd71d71c6 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/floor/plating/airless, /area/ruin/unpowered) @@ -10,12 +10,12 @@ /area/ruin/unpowered) "d" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "e" = ( /obj/structure/lattice, /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm index 1c7d14bd6fa..ce660407cca 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm index ff8a5ac4cc2..fe74e127741 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm index 4c33095219a..0f30191dfb6 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall/r_wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm index 0f7c36fe634..a8b394a6421 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm @@ -1,11 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "c" = ( /turf/simulated/wall, /area/ruin/unpowered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index a993ab96190..ad1ca6cf96a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -1,9 +1,9 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -15,7 +15,7 @@ }, /area/ruin/powered) "d" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 2; icon_state = "diagonalWall3" @@ -198,7 +198,7 @@ }, /area/ruin/powered) "A" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -212,7 +212,7 @@ }, /area/ruin/powered) "C" = ( -/turf/space, +/turf/template_noop, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 17d49d666bc..cd47fb8ac43 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral, /area/ruin/powered) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm index b4e36942d6a..99b254e2684 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/shuttle/wall{ tag = "icon-swall_s6"; @@ -168,7 +168,7 @@ /area/ruin/powered) "D" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "E" = ( /obj/item/stack/rods, @@ -202,7 +202,7 @@ /area/ruin/powered) "K" = ( /obj/item/stack/sheet/metal, -/turf/space, +/turf/template_noop, /area/space/nearstation) "L" = ( /obj/structure/mecha_wreckage/gygax, @@ -228,7 +228,7 @@ /area/ruin/powered) "P" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "Q" = ( /turf/simulated/shuttle/wall{ diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm index fa38a1a647b..93dc1fffed4 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -10,7 +10,7 @@ icon_state = "2-4"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ac" = ( /obj/structure/lattice, @@ -20,7 +20,7 @@ icon_state = "4-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ad" = ( /obj/structure/lattice, @@ -29,7 +29,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ae" = ( /obj/structure/lattice, @@ -38,7 +38,7 @@ dir = 2; icon_state = "coil_red2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "af" = ( /obj/structure/lattice, @@ -48,7 +48,7 @@ icon_state = "1-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ag" = ( /turf/simulated/wall, @@ -65,7 +65,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "aj" = ( /turf/unsimulated/floor/plating/airless, @@ -154,11 +154,11 @@ /area/ruin/onehalf/drone_bay) "aw" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "ax" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "ay" = ( /obj/structure/table_frame, @@ -224,7 +224,7 @@ /area/ruin/onehalf/drone_bay) "aH" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "aI" = ( /obj/effect/landmark/damageturf, @@ -805,7 +805,7 @@ /area/ruin/onehalf/bridge) "bU" = ( /obj/item/stack/sheet/metal, -/turf/space, +/turf/template_noop, /area/space/nearstation) "bV" = ( /obj/structure/disposalpipe/segment, @@ -914,7 +914,7 @@ dir = 4 }, /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cn" = ( /obj/structure/lattice, @@ -925,7 +925,7 @@ tag = "icon-small"; icon_state = "small" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "co" = ( /obj/structure/grille, @@ -1008,7 +1008,7 @@ /area/ruin/onehalf/bridge) "cv" = ( /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cw" = ( /turf/unsimulated/floor/plating/airless, @@ -1016,7 +1016,7 @@ "cx" = ( /obj/structure/lattice, /obj/item/stack/sheet/plasteel, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cy" = ( /obj/structure/lattice, @@ -1024,7 +1024,7 @@ tag = "icon-medium"; icon_state = "medium" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cz" = ( /obj/structure/grille/broken, @@ -1071,10 +1071,10 @@ /area/ruin/onehalf/bridge) "cE" = ( /obj/item/stack/tile/wood, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cF" = ( -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cG" = ( /obj/structure/lattice, @@ -1083,7 +1083,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cH" = ( /obj/structure/lattice, @@ -1097,7 +1097,7 @@ icon_state = "pipe-b"; dir = 8 }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cI" = ( /obj/machinery/door/airlock/command/glass{ @@ -1149,7 +1149,7 @@ dir = 2; icon_state = "coil_red2" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cQ" = ( /obj/machinery/light{ @@ -1160,7 +1160,7 @@ /area/ruin/onehalf/bridge) "cR" = ( /obj/item/stack/sheet/plasteel, -/turf/space, +/turf/template_noop, /area/space/nearstation) "cS" = ( /obj/structure/lattice, @@ -1169,7 +1169,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/ruin/onehalf/hallway) "cU" = ( /obj/structure/grille, @@ -1221,7 +1221,7 @@ d2 = 8; icon_state = "2-8" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "db" = ( /obj/structure/table, @@ -1256,7 +1256,7 @@ d2 = 2; icon_state = "1-2" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dg" = ( /obj/structure/girder/reinforced, @@ -1350,7 +1350,7 @@ tag = "icon-medium"; icon_state = "medium" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dp" = ( /obj/structure/lattice, @@ -1366,7 +1366,7 @@ icon_state = "1-4" }, /obj/item/stack/rods, -/turf/space, +/turf/template_noop, /area/space/nearstation) "dq" = ( /obj/structure/lattice, @@ -1382,7 +1382,7 @@ icon_state = "1-8"; tag = "" }, -/turf/space, +/turf/template_noop, /area/space/nearstation) (1,1,1) = {" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index 108c8103975..1f9725a3d03 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/mineral, /area/space/nearstation) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm index 96e43773146..67dc298eb20 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -1,10 +1,10 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /obj/structure/lattice, -/turf/space, +/turf/template_noop, /area/space/nearstation) "c" = ( /obj/structure/grille, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm index b0613eef965..dc1e468624b 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "b" = ( /turf/simulated/mineral/random, /area/ruin/unpowered/no_grav/way_home) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm index ebfaf3b94b4..a063d88a252 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/wizardcrash.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/space, -/area/space) +/turf/template_noop, +/area/template_noop) "ab" = ( /turf/simulated/floor/plating/asteroid/airless, /area/ruin/unpowered) From fffe72e25865c8455033d4e658038774b37a9186 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 24 Jul 2020 21:00:59 +0200 Subject: [PATCH 066/111] Fixes dupe with wet leather --- code/game/objects/items/stacks/sheets/leather.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 6bdfdd49234..9f6844c8b9e 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ HS.amount++ src.use(1) wetness = initial(wetness) - break + return //If it gets to here it means it did not find a suitable stack on the tile. var/obj/item/stack/sheet/leather/HS = new(src.loc) HS.amount = 1 From 8eeff80419e3e7177aa5b89cf081ce43312cadd6 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 25 Jul 2020 00:31:02 +0100 Subject: [PATCH 067/111] Update lavaland_surface_ash_walker1.dmm --- .../RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 281346d9b8f..be8f849400f 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1205,9 +1205,9 @@ /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "dg" = ( -/obj/structure/bonfire/dense, /obj/structure/stone_tile/center, /obj/effect/mapping_helpers/no_lava, +/obj/structure/bonfire, /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "di" = ( From 40a91624eecca225d75e83d42eecf2164f550cf6 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 25 Jul 2020 12:01:37 +0100 Subject: [PATCH 068/111] Minor subsystem tweaks --- code/controllers/subsystem/garbage.dm | 2 +- code/controllers/subsystem/nano_mob_hunter.dm | 1 + code/controllers/subsystem/{ => processing}/dcs.dm | 0 paradise.dme | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) rename code/controllers/subsystem/{ => processing}/dcs.dm (100%) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 619508544a6..e50c372584a 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -4,7 +4,7 @@ SUBSYSTEM_DEF(garbage) wait = 2 SECONDS flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - init_order = INIT_ORDER_GARBAGE + init_order = INIT_ORDER_GARBAGE // Why does this have an init order if it has SS_NO_INIT? offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended." var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm index 19b57f59a70..b8a5d09e0b5 100644 --- a/code/controllers/subsystem/nano_mob_hunter.dm +++ b/code/controllers/subsystem/nano_mob_hunter.dm @@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt) name = "Nano-Mob Hunter GO Server" init_order = INIT_ORDER_NANOMOB priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact. + flags = SS_NO_INIT offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed." var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this var/list/normal_spawns = list() diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/processing/dcs.dm similarity index 100% rename from code/controllers/subsystem/dcs.dm rename to code/controllers/subsystem/processing/dcs.dm diff --git a/paradise.dme b/paradise.dme index ca3ce303ce9..70c17c96107 100644 --- a/paradise.dme +++ b/paradise.dme @@ -218,7 +218,6 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\changelog.dm" #include "code\controllers\subsystem\chat.dm" -#include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fires.dm" #include "code\controllers\subsystem\garbage.dm" @@ -251,6 +250,7 @@ #include "code\controllers\subsystem\titlescreen.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\dcs.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" From 35cdc641b2a6d4a0915fda9ca7019c974c77641b Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 25 Jul 2020 18:09:57 +0100 Subject: [PATCH 069/111] Unit Test For Invalid Map Templates --- code/datums/shuttles.dm | 5 +++-- code/modules/awaymissions/maploader/reader.dm | 5 +++++ code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/map_templates.dm | 7 +++++++ 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 code/modules/unit_tests/map_templates.dm diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 53517d5dbc9..4d6310041e5 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -9,8 +9,9 @@ var/admin_notes /datum/map_template/shuttle/New() - shuttle_id = "[port_id]_[suffix]" - mappath = "[prefix][shuttle_id].dmm" + if(port_id && suffix) + shuttle_id = "[port_id]_[suffix]" + mappath = "[prefix][shuttle_id].dmm" . = ..() /datum/map_template/shuttle/emergency diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 7efff7cc27b..4c448e6416b 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -30,6 +30,11 @@ GLOBAL_DATUM_INIT(_preloader, /datum/dmm_suite/preloader, new()) var/fname = "Lambda" if(isfile(tfile)) fname = "[tfile]" + // Make sure we dont load a dir up + var/lastchar = copytext(dmm_file, -1) + if(lastchar == "/" || lastchar == "\\") + log_debug("Attempted to load map template without filename (Attempted [tfile])") + return tfile = file2text(tfile) if(!length(tfile)) throw EXCEPTION("Map path '[fname]' does not exist!") diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 5b1409af4e7..80467d19846 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -3,6 +3,7 @@ #ifdef UNIT_TESTS #include "component_tests.dm" +#include "map_templates.dm" #include "reagent_id_typos.dm" #include "spawn_humans.dm" #include "sql.dm" diff --git a/code/modules/unit_tests/map_templates.dm b/code/modules/unit_tests/map_templates.dm new file mode 100644 index 00000000000..b590526a46b --- /dev/null +++ b/code/modules/unit_tests/map_templates.dm @@ -0,0 +1,7 @@ +/datum/unit_test/map_templates/Run() + var/list/datum/map_template/templates = subtypesof(/datum/map_template) + for(var/I in templates) + var/datum/map_template/MT = new I // The new is important here to ensure stuff gets set properly + // Check if it even has a path and if so, does it exist + if(MT.mappath && !fexists(MT.mappath)) + Fail("The map file for [MT.type] does not exist!") From d5b470bc148dc858f328abd72626e2564a4e3b00 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 25 Jul 2020 18:20:08 +0100 Subject: [PATCH 070/111] Failure test case --- _maps/map_files/shuttles/{emergency_clown.dmm => break.dmm} | 0 code/modules/awaymissions/maploader/reader.dm | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename _maps/map_files/shuttles/{emergency_clown.dmm => break.dmm} (100%) diff --git a/_maps/map_files/shuttles/emergency_clown.dmm b/_maps/map_files/shuttles/break.dmm similarity index 100% rename from _maps/map_files/shuttles/emergency_clown.dmm rename to _maps/map_files/shuttles/break.dmm diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index 4c448e6416b..f034c4f39d1 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -31,7 +31,7 @@ GLOBAL_DATUM_INIT(_preloader, /datum/dmm_suite/preloader, new()) if(isfile(tfile)) fname = "[tfile]" // Make sure we dont load a dir up - var/lastchar = copytext(dmm_file, -1) + var/lastchar = copytext(fname, -1) if(lastchar == "/" || lastchar == "\\") log_debug("Attempted to load map template without filename (Attempted [tfile])") return From c8b4696559bcb552feb9d938315293857ceced35 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 25 Jul 2020 18:29:32 +0100 Subject: [PATCH 071/111] Task Failed Successfully --- _maps/map_files/shuttles/{break.dmm => emergency_clown.dmm} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _maps/map_files/shuttles/{break.dmm => emergency_clown.dmm} (100%) diff --git a/_maps/map_files/shuttles/break.dmm b/_maps/map_files/shuttles/emergency_clown.dmm similarity index 100% rename from _maps/map_files/shuttles/break.dmm rename to _maps/map_files/shuttles/emergency_clown.dmm From 7b13ec48845275bc95ada543efe3acabe997f789 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 26 Jul 2020 11:08:07 +0200 Subject: [PATCH 072/111] Adds missing mech attack logging --- code/__HELPERS/mobs.dm | 7 ++++++- code/game/mecha/mecha.dm | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a38eeb99ced..77ce3e45c76 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -289,11 +289,15 @@ This is always put in the attack log. var/user_str = key_name_log(user) + COORD(user) var/target_str + var/target_info + var/user_info if(isatom(target)) var/atom/AT = target target_str = key_name_log(AT) + COORD(AT) + target_info = key_name_admin(target) else target_str = target + target_info = target var/mob/MU = user var/mob/MT = target if(istype(MU)) @@ -320,7 +324,8 @@ This is always put in the attack log. if(isLivingSSD(target)) // Attacks on SSDs are shown to admins with any log level except ATKLOG_NONE. Overrides custom level loglevel = ATKLOG_FEW - msg_admin_attack("[key_name_admin(user)] vs [key_name_admin(target)]: [what_done]", loglevel) + + msg_admin_attack("[key_name_admin(user)] vs [target_info]: [what_done]", loglevel) /proc/do_mob(mob/user, mob/target, time = 30, uninterruptible = 0, progress = 1, list/extra_checks = list()) if(!user || !target) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 52973c9e285..f8b7d45592c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1,3 +1,5 @@ +#define OCCUPANT_LOGGING occupant ? occupant : "empty mech" + /obj/mecha name = "Mecha" desc = "Exosuit" @@ -544,6 +546,7 @@ /obj/mecha/attack_alien(mob/living/user) log_message("Attack by alien. Attacker - [user].", TRUE) + add_attack_logs(user, OCCUPANT_LOGGING, "Alien attacked mech [src]") playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE) attack_generic(user, 15, BRUTE, "melee", 0) @@ -562,7 +565,7 @@ animal_damage = user.obj_damage animal_damage = min(animal_damage, 20*user.environment_smash) user.create_attack_log("attacked [name]") - add_attack_logs(user, src, "Attacked") + add_attack_logs(user, OCCUPANT_LOGGING, "Animal attacked mech [src]") attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect) return TRUE @@ -573,7 +576,7 @@ . = ..() if(.) log_message("Attack by hulk. Attacker - [user].", 1) - add_attack_logs(user, src, "Punched with hulk powers") + add_attack_logs(user, OCCUPANT_LOGGING, "Hulk punched mech [src]") /obj/mecha/blob_act(obj/structure/blob/B) log_message("Attack by blob. Attacker - [B].") @@ -584,10 +587,14 @@ /obj/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper log_message("Hit by [AM].") + if(isitem(AM)) + var/obj/item/I = AM + add_attack_logs(I.thrownby, OCCUPANT_LOGGING, "threw [AM] at mech [src]") . = ..() /obj/mecha/bullet_act(obj/item/projectile/Proj) //wrapper log_message("Hit by projectile. Type: [Proj.name]([Proj.flag]).") + add_attack_logs(Proj.firer, OCCUPANT_LOGGING, "shot [Proj.name]([Proj.flag]) at mech [src]") ..() /obj/mecha/ex_act(severity, target) @@ -774,6 +781,7 @@ to_chat(user, "You stop installing [M].") else + add_attack_logs(user, OCCUPANT_LOGGING, "attacked mech '[src]' using [W]") return ..() @@ -1534,3 +1542,5 @@ if(L.incapacitated()) return FALSE return TRUE + +#undef OCCUPANT_LOGGING From 59280183bd929bd23beb386d06496d0639645b4d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 26 Jul 2020 11:33:07 +0200 Subject: [PATCH 073/111] Remove unused var --- code/__HELPERS/mobs.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 77ce3e45c76..bf171de117d 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -290,7 +290,6 @@ This is always put in the attack log. var/user_str = key_name_log(user) + COORD(user) var/target_str var/target_info - var/user_info if(isatom(target)) var/atom/AT = target target_str = key_name_log(AT) + COORD(AT) From 299f6384e021e41f63e8d966f059ae62d2b0ffee Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 26 Jul 2020 12:16:03 +0200 Subject: [PATCH 074/111] Spam fixes --- code/__HELPERS/mobs.dm | 2 ++ code/game/mecha/mecha.dm | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index bf171de117d..0d3b26d0340 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -320,6 +320,8 @@ This is always put in the attack log. var/area/A = get_area(MT) if(A && A.hide_attacklogs) loglevel = ATKLOG_ALMOSTALL + else + loglevel = ATKLOG_ALL // Hitting an object. Not a mob if(isLivingSSD(target)) // Attacks on SSDs are shown to admins with any log level except ATKLOG_NONE. Overrides custom level loglevel = ATKLOG_FEW diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f8b7d45592c..1dc09d13e63 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -564,8 +564,8 @@ if(user.obj_damage) animal_damage = user.obj_damage animal_damage = min(animal_damage, 20*user.environment_smash) - user.create_attack_log("attacked [name]") - add_attack_logs(user, OCCUPANT_LOGGING, "Animal attacked mech [src]") + if(animal_damage) + add_attack_logs(user, OCCUPANT_LOGGING, "Animal attacked mech [src]") attack_generic(user, animal_damage, user.melee_damage_type, "melee", play_soundeffect) return TRUE @@ -781,7 +781,8 @@ to_chat(user, "You stop installing [M].") else - add_attack_logs(user, OCCUPANT_LOGGING, "attacked mech '[src]' using [W]") + if(W.force) + add_attack_logs(user, OCCUPANT_LOGGING, "attacked mech '[src]' using [W]") return ..() From c64cd72d0248c61d3bcd033173dff1ab1a8972b5 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 26 Jul 2020 12:35:56 +0100 Subject: [PATCH 075/111] Removes bad symbol --- code/modules/paperwork/ticketmachine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index c5939c392b1..fe417c91e40 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -169,7 +169,7 @@ /obj/item/ticket_machine_ticket name = "Ticket" - desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." + desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." icon = 'icons/obj/bureaucracy.dmi' icon_state = "ticket" maptext_x = 7 From e778f895ab8704b1b4484ab65da93bf4653d4cc7 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 09:35:02 -0500 Subject: [PATCH 076/111] yes --- code/game/gamemodes/wizard/spellbook.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index d1695a86603..d0773947c21 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -610,7 +610,7 @@ var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon - /datum/spellbook_entry/loadout for(var/T in entry_types) var/datum/spellbook_entry/E = new T - if(GAMEMODE_IS_WIZARD && E.is_ragin_restricted) + if(GAMEMODE_IS_RAGIN_MAGES && E.is_ragin_restricted) qdel(E) continue entries |= E From f6925381bbd7194d3e1deff5e8eb46c43783afe9 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 10:00:56 -0500 Subject: [PATCH 077/111] teleporter --- code/game/machinery/teleporter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index b92e3c78bb8..59bae3174c4 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -79,7 +79,7 @@ /obj/machinery/computer/teleporter/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) var/data[0] data["powerstation"] = power_station - if(power_station) + if(power_station?.teleporter_hub) data["teleporterhub"] = power_station.teleporter_hub data["calibrated"] = power_station.teleporter_hub.calibrated data["accurate"] = power_station.teleporter_hub.accurate From 73f756f1de4ec748b0d6f3a7cea38c76c9f4e166 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 26 Jul 2020 20:53:58 +0100 Subject: [PATCH 078/111] Adds missing offline implications --- code/controllers/subsystem.dm | 2 +- code/controllers/subsystem/processing/dcs.dm | 2 ++ code/controllers/subsystem/processing/fastprocess.dm | 1 + code/controllers/subsystem/processing/obj.dm | 1 + code/controllers/subsystem/processing/processing.dm | 1 + code/controllers/subsystem/tickets/mentor_tickets.dm | 1 + code/controllers/subsystem/tickets/tickets.dm | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 03e54df61c5..c9934b128cf 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -35,7 +35,7 @@ var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out! - var/offline_implications = "None" // What are the implications of this SS being offlined? + var/offline_implications = "None. No immediate action is needed." // What are the implications of this SS being offlined? //Do not override ///datum/controller/subsystem/New() diff --git a/code/controllers/subsystem/processing/dcs.dm b/code/controllers/subsystem/processing/dcs.dm index 09dea24071f..a223f4676f6 100644 --- a/code/controllers/subsystem/processing/dcs.dm +++ b/code/controllers/subsystem/processing/dcs.dm @@ -3,6 +3,8 @@ PROCESSING_SUBSYSTEM_DEF(dcs) flags = SS_NO_INIT var/list/elements_by_type = list() + // Update this if you add in components which actually use this as a processor + offline_implications = "This SS doesnt actually process anything yet. No immediate action is needed." /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 9622e021469..37761ca8d60 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -4,3 +4,4 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" wait = 2 stat_tag = "FP" + offline_implications = "Objects using the 'Fast Processing' processor will no longer process. Shuttle call recommended." diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm index 26021fb267a..2a05c04af58 100644 --- a/code/controllers/subsystem/processing/obj.dm +++ b/code/controllers/subsystem/processing/obj.dm @@ -3,3 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(obj) priority = FIRE_PRIORITY_OBJ flags = SS_NO_INIT wait = 20 + offline_implications = "Objects using the 'Objects' processor will no longer process. Shuttle call recommended." diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index a8bc823bbbe..5302314589d 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(processing) var/stat_tag = "P" //Used for logging var/list/processing = list() var/list/currentrun = list() + offline_implications = "Objects using the default processor will no longer process. Shuttle call recommended." /datum/controller/subsystem/processing/stat_entry() ..("[stat_tag]:[processing.len]") diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 76c7ed2dc28..3fd003418a4 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -10,6 +10,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets ticket_name = "Mentor Ticket" span_class = "mentorhelp" close_rights = R_MENTOR | R_ADMIN + offline_implications = "Mentor tickets will no longer be marked as stale. No immediate action is needed." /datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg) message_mentorTicket(msg) diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 3aa0a8846c3..8fae7179706 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -20,6 +20,7 @@ SUBSYSTEM_DEF(tickets) init_order = INIT_ORDER_TICKETS wait = 300 priority = FIRE_PRIORITY_TICKETS + offline_implications = "Admin tickets will no longer be marked as stale. No immediate action is needed." flags = SS_BACKGROUND From 8d73f4edb69a9df08f93b2a54c7089c67ef63589 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 26 Jul 2020 16:55:53 -0500 Subject: [PATCH 079/111] rev fix --- code/game/gamemodes/miniantags/revenant/revenant.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index f86f018757e..637ab69bf04 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -16,6 +16,7 @@ var/icon_stun = "revenant_stun" var/icon_drain = "revenant_draining" incorporeal_move = 3 + see_invisible = INVISIBILITY_REVENANT invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY From 2f08b2df022a44ddb4dce8d7821b2d5a3c63276f Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Mon, 27 Jul 2020 08:49:11 +0100 Subject: [PATCH 080/111] More Improvements --- code/modules/paperwork/ticketmachine.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index fe417c91e40..2234e2911a6 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -108,7 +108,7 @@ maptext_x = 10 if(100) maptext_x = 8 - maptext = "[current_number]" //Finally, apply the maptext + maptext = "[ticket_number]" /obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/hand_labeler_refill)) @@ -151,8 +151,8 @@ to_chat(user, "You take a ticket from [src], looks like you're ticket number #[ticket_number]...") var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src)) theirticket.name = "Ticket #[ticket_number]" - theirticket.maptext = "[ticket_number]" - theirticket.saved_maptext = "[ticket_number]" + theirticket.maptext = "[ticket_number]" + theirticket.saved_maptext = "[ticket_number]" theirticket.ticket_number = ticket_number theirticket.source = src theirticket.owner = user.UID() @@ -167,6 +167,10 @@ user.adjust_fire_stacks(1) user.IgniteMob() +// Stop AI penetrating the bureaucracy +/obj/machinery/ticket_machine/attack_ai(mob/user) + return + /obj/item/ticket_machine_ticket name = "Ticket" desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." From 7c61d340efe9e2c321fd21529b2eae3cf3f3402b Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 27 Jul 2020 06:40:53 -0700 Subject: [PATCH 081/111] Remove perimeter shields call --- code/game/machinery/computer/depot.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 62c82d9bd95..cc85ec7fc85 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -193,10 +193,6 @@ /obj/machinery/computer/syndicate_depot/shieldcontrol/New() . = ..() perimeterarea = locate(/area/syndicate_depot/perimeter) - if(istype(perimeterarea) && (GAMEMODE_IS_NUCLEAR || prob(20))) - spawn(200) - perimeterarea.perimeter_shields_up() - depotarea.perimeter_shield_status = TRUE /obj/machinery/computer/syndicate_depot/shieldcontrol/Destroy() if(istype(perimeterarea) && perimeterarea.shield_list.len) From 094934a49b153f36c96d88f320ddc33e8dc32c07 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Tue, 28 Jul 2020 21:46:05 +0100 Subject: [PATCH 082/111] Removes some non ASCII characters --- code/modules/customitems/item_defines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 1a5da52ffce..530b9095f75 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -349,7 +349,7 @@ to_chat(user, "You modify the appearance of [target].") var/obj/item/clothing/mask/gas/M = target M.name = "Prescription Gas Mask" - M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale” can be seen on the inner band." + M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words \"Property of Yon-Dale\" can be seen on the inner band." M.icon = 'icons/obj/custom_items.dmi' M.icon_state = "gas_tariq" M.sprite_sheets = list( From 0ceed65640a4c0d4d7e7ab88b908d1b4d8662a6f Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 28 Jul 2020 14:21:44 -0700 Subject: [PATCH 083/111] fix faction error in listeningpost.dmm --- .../RandomRuins/SpaceRuins/listeningpost.dmm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index cd47fb8ac43..5ef8142d52a 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -71,11 +71,6 @@ /obj/structure/chair{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate{ - desc = "A weary looking syndicate operative."; - environment_smash = 0; - faction = "syndicate" - }, /turf/simulated/floor/plasteel, /area/ruin/powered) "r" = ( @@ -269,6 +264,12 @@ icon_state = "freezerfloor" }, /area/ruin/powered) +"T" = ( +/mob/living/simple_animal/hostile/syndicate{ + environment_smash = 0 + }, +/turf/simulated/floor/plasteel, +/area/ruin/powered) "Y" = ( /obj/item/gps/ruin, /turf/simulated/wall/r_wall, @@ -1006,7 +1007,7 @@ b f k q -m +T m i m From e59427906fd3fe0e6ff9132bcdd1ab1e071e0971 Mon Sep 17 00:00:00 2001 From: Kyep Date: Tue, 28 Jul 2020 18:15:55 -0700 Subject: [PATCH 084/111] squash --- _maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 5ef8142d52a..e1a2c2666c4 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -264,8 +264,9 @@ icon_state = "freezerfloor" }, /area/ruin/powered) -"T" = ( +"V" = ( /mob/living/simple_animal/hostile/syndicate{ + desc = "A weary looking syndicate operative."; environment_smash = 0 }, /turf/simulated/floor/plasteel, @@ -1007,7 +1008,7 @@ b f k q -T +V m i m From debcf5dad095070ac54d1a62a523ed8598f265e4 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Wed, 29 Jul 2020 10:06:00 +0100 Subject: [PATCH 085/111] Replaces all "var " with "var/" --- code/game/gamemodes/miniantags/borer/borer.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/depot.dm | 4 ++-- code/game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/weapons/RSF.dm | 2 +- code/game/objects/items/weapons/cards_ids.dm | 4 ++-- code/game/objects/items/weapons/storage/bags.dm | 6 +++--- code/game/objects/items/weapons/storage/storage.dm | 2 +- code/modules/admin/verbs/onlyone.dm | 2 +- code/modules/antagonists/_common/antag_spawner.dm | 2 +- code/modules/antagonists/traitor/datum_traitor.dm | 2 +- code/modules/events/slaughterevent.dm | 2 +- code/modules/mining/abandonedcrates.dm | 2 +- code/modules/mob/new_player/poll.dm | 2 +- code/modules/projectiles/guns/energy/special.dm | 2 +- code/modules/reagents/chemistry/recipes/slime_extracts.dm | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index f99a00567ae..750473b1dfa 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -394,7 +394,7 @@ to_chat(src, " You are feeling far too docile to do that.") return - var content = "" + var/content = "" content += "" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 3091caa82a2..5198a97a88c 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -164,7 +164,7 @@ data["selected_pod"] = "\ref[selected_pod]" var/list/temprecords[0] for(var/datum/dna2/record/R in records) - var tempRealName = R.dna.real_name + var/tempRealName = R.dna.real_name temprecords.Add(list(list("record" = "\ref[R]", "realname" = sanitize(tempRealName)))) data["records"] = temprecords diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 62c82d9bd95..9ba28094ace 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -165,7 +165,7 @@ alerts_when_broken = TRUE /obj/machinery/computer/syndicate_depot/selfdestruct/get_menu(mob/user) - var menutext = {"Syndicate Depot Fusion Reactor Control
+ var/menutext = {"Syndicate Depot Fusion Reactor Control


Disable Containment Field
"} return menutext @@ -204,7 +204,7 @@ return ..() /obj/machinery/computer/syndicate_depot/shieldcontrol/get_menu(mob/user) - var menutext = {"Syndicate Depot Shield Grid Control
+ var/menutext = {"Syndicate Depot Shield Grid Control

"} menutext += {"(SYNDI-LEADER) Whole-base Shield: [perimeterarea.shield_list.len ? "ON" : "OFF"] ([perimeterarea.shield_list.len ? "Disable" : "Enable"])
"} menutext += {"(SYNDI-LEADER) Armory Shield: [depotarea.shield_list.len ? "ON" : "OFF"] ([depotarea.shield_list.len ? "Disable" : "Enable"])
"} diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7ddf11ab451..7cf09199cfd 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -226,7 +226,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( channels[chan_name] |= FREQ_LISTENING . = 1 else if(href_list["spec_freq"]) - var freq = href_list["spec_freq"] + var/freq = href_list["spec_freq"] if(has_channel_access(usr, freq)) set_frequency(text2num(freq)) . = 1 diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index a8da7503c72..26cef27a0b4 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -58,7 +58,7 @@ RSF if(!proximity) return if(!(istype(A, /obj/structure/table) || istype(A, /turf/simulated/floor))) return - var spawn_location + var/spawn_location var/turf/T = get_turf(A) if(istype(T) && !T.density) spawn_location = T diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 405ce47a033..dc26b14e24b 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -356,13 +356,13 @@ /obj/item/card/id/syndicate/attack_self(mob/user as mob) if(!src.registered_name) - var t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) + var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name)) if(!t) to_chat(user, "Invalid name.") return src.registered_name = t - var u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) + var/u = sanitize(stripped_input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN)) if(!u) to_chat(user, "Invalid assignment.") src.registered_name = "" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4a449069d4c..6d5a192c641 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -421,13 +421,13 @@ /obj/item/storage/bag/tray/cyborg/afterattack(atom/target, mob/user as mob) if( isturf(target) || istype(target,/obj/structure/table) ) - var foundtable = istype(target,/obj/structure/table/) + var/foundtable = istype(target,/obj/structure/table/) if( !foundtable ) //it must be a turf! for(var/obj/structure/table/T in target) foundtable = 1 break - var turf/dropspot + var/turf/dropspot if( !foundtable ) // don't unload things onto walls or other silly places. dropspot = user.loc else if( isturf(target) ) // they clicked on a turf with a table in it @@ -437,7 +437,7 @@ overlays = null - var droppedSomething = 0 + var/droppedSomething = 0 for(var/obj/item/I in contents) I.loc = dropspot diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 55b25ad725a..16bd6f4caa8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -541,7 +541,7 @@ return depth /obj/item/storage/serialize() - var data = ..() + var/data = ..() var/list/content_list = list() data["content"] = content_list data["slots"] = storage_slots diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index e51f6da991a..9f2579ad162 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -84,7 +84,7 @@ var/obj/item/slot_item_hand = H.get_item_by_slot(slot_r_hand) H.unEquip(slot_item_hand) - var /obj/item/multisword/pure_evil/multi = new(H) + var/obj/item/multisword/pure_evil/multi = new(H) H.equip_to_slot_or_del(multi, slot_r_hand) var/obj/item/card/id/W = new(H) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index beefc41735b..8e29326632f 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -194,7 +194,7 @@ to_chat(user, "The demons do not respond to your summon. Perhaps you should try again later.") /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "", mob/user) - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/mob/living/simple_animal/slaughter/S = new demon_type(holder) S.vialspawned = TRUE S.holder = holder diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 957300326a6..ee23ea35d98 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -399,7 +399,7 @@ var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") var/responses = jointext(GLOB.syndicate_code_response, ", ") - var message = "
The code phrases were:[phrases]
\ + var/message = "
The code phrases were:[phrases]
\ The code responses were:[responses]
" return message diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm index ac265adb420..91918894cfd 100644 --- a/code/modules/events/slaughterevent.dm +++ b/code/modules/events/slaughterevent.dm @@ -33,7 +33,7 @@ spawn_locs += get_turf(player_mind.current) if(!spawn_locs) //If we can't find THAT, then just retry return kill() - var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs)) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs)) var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) S.holder = holder player_mind.transfer_to(S) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 9b74c922a6b..044b78a04bc 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -82,7 +82,7 @@ new /obj/item/clothing/head/corgi(src) if(67 to 68) for(var/i in 1 to rand(4, 7)) - var /newitem = pick(subtypesof(/obj/item/stock_parts)) + var/newitem = pick(subtypesof(/obj/item/stock_parts)) new newitem(src) if(69 to 70) new /obj/item/stack/ore/bluespace_crystal(src, 5) diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index 19893819e0c..2e109d36d34 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -90,7 +90,7 @@ if(adminonly) question = "(Admin only poll) " + question - var output = "" + var/output = "" if(polltype == POLLTYPE_MULTI || polltype == POLLTYPE_OPTION) select_query = GLOB.dbcon.NewQuery("SELECT text, percentagecalc, (SELECT COUNT(optionid) FROM [format_table_name("poll_vote")] WHERE optionid = poll_option.id GROUP BY optionid) AS votecount FROM [format_table_name("poll_option")] WHERE pollid = [pollid]") select_query.Execute() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 48aaff9d8b4..e2eb9e84057 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -424,7 +424,7 @@ update_icon() if(istype(loc, /mob/living/carbon)) - var /mob/living/carbon/M = loc + var/mob/living/carbon/M = loc if(src == M.machine) update_dat() M << browse("Temperature Gun Configuration
[dat]", "window=tempgun;size=510x102") diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index b1fb33edf85..1525ed42bd3 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -38,7 +38,7 @@ /datum/chemical_reaction/slimemonkey/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") for(var/i = 1, i <= 3, i++) - var /obj/item/reagent_containers/food/snacks/monkeycube/M = new /obj/item/reagent_containers/food/snacks/monkeycube + var/obj/item/reagent_containers/food/snacks/monkeycube/M = new /obj/item/reagent_containers/food/snacks/monkeycube M.forceMove(get_turf(holder.my_atom)) //Green From 471dce56c328a7e8d423b7f68a8beafe02014ff2 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 29 Jul 2020 17:49:27 -0700 Subject: [PATCH 086/111] fox request --- .../RandomRuins/SpaceRuins/listeningpost.dmm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index e1a2c2666c4..32d5ea2af1d 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -71,6 +71,10 @@ /obj/structure/chair{ dir = 4 }, +/mob/living/simple_animal/hostile/syndicate{ + desc = "A weary looking syndicate operative."; + environment_smash = 0 + }, /turf/simulated/floor/plasteel, /area/ruin/powered) "r" = ( @@ -264,13 +268,6 @@ icon_state = "freezerfloor" }, /area/ruin/powered) -"V" = ( -/mob/living/simple_animal/hostile/syndicate{ - desc = "A weary looking syndicate operative."; - environment_smash = 0 - }, -/turf/simulated/floor/plasteel, -/area/ruin/powered) "Y" = ( /obj/item/gps/ruin, /turf/simulated/wall/r_wall, @@ -1008,7 +1005,7 @@ b f k q -V +m m i m From ef230a92d0e3d428d868e084094e2d5ea6d80fa0 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 29 Jul 2020 18:54:15 -0700 Subject: [PATCH 087/111] Stops force-feeding non-carbon mobs reagents --- code/modules/reagents/reagent_containers/glass_containers.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 1e42899111b..1ab6a1c2511 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -47,6 +47,11 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() else + if(!iscarbon(M)) + // This is a simple mob, or some other kind of mob that cannot process reagents. + // It makes no sense to inject reagents into mobs that don't even process them. + to_chat(user, "You cannot find a way to feed [M].") + return if(M != user) M.visible_message("[user] attempts to feed something to [M].", \ "[user] attempts to feed something to you.") From 14dc4d1e2b821af8593d90030c60e2f4632bf173 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 30 Jul 2020 13:09:15 +0100 Subject: [PATCH 088/111] Removes ToR Ban --- code/controllers/configuration.dm | 4 -- code/modules/admin/IsBanned.dm | 11 ---- code/modules/admin/ToRban.dm | 89 ------------------------------- code/modules/admin/admin_verbs.dm | 1 - config/example/config.txt | 3 -- paradise.dme | 1 - 6 files changed, 109 deletions(-) delete mode 100644 code/modules/admin/ToRban.dm diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f4f2f72b16b..756ce6f8527 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -61,7 +61,6 @@ var/usewhitelist = 0 var/mods_are_mentors = 0 var/load_jobs_from_txt = 0 - var/ToRban = 0 var/automute_on = 0 //enables automuting/spam prevention var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. var/round_abandon_penalty_period = 30 MINUTES // Time from round start during which ghosting out is penalized @@ -578,9 +577,6 @@ if("humans_need_surnames") humans_need_surnames = 1 - if("tor_ban") - ToRban = 1 - if("automute_on") automute_on = 1 diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index c7f2baac4ef..d9ceba62830 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -36,17 +36,6 @@ world/IsBanned(key, address, computer_id, type, check_ipintel = TRUE) // message_admins("Failed Login: [key] - Guests not allowed") return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a BYOND account.") - //check if the IP address is a known Tor node - if(config.ToRban && ToRban_isbanned(address)) - log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned: Tor") - message_admins("Failed Login: [key] - Banned: Tor") - //ban their computer_id and ckey for posterity - AddBan(ckey(key), computer_id, "Use of Tor", "Automated Ban", 0, 0) - var/mistakemessage = "" - if(config.banappeals) - mistakemessage = "\nIf you believe this is a mistake, please request help at [config.banappeals]." - return list("reason"="using Tor", "desc"="\nReason: The network you are using to connect has been banned.[mistakemessage]") - //check if the IP address is a known proxy/vpn, and the user is not whitelisted if(check_ipintel && config.ipintel_email && config.ipintel_whitelist && ipintel_is_banned(key, address)) log_adminwarn("Failed Login: [key] [computer_id] [address] - Proxy/VPN") diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm deleted file mode 100644 index b486f168503..00000000000 --- a/code/modules/admin/ToRban.dm +++ /dev/null @@ -1,89 +0,0 @@ -//By Carnwennan -//fetches an external list and processes it into a list of ip addresses. -//It then stores the processed list into a savefile for later use -#define TORFILE "data/ToR_ban.bdb" -#define TOR_UPDATE_INTERVAL 216000 //~6 hours - -/proc/ToRban_isbanned(var/ip_address) - var/savefile/F = new(TORFILE) - if(F) - if( ip_address in F.dir ) - return 1 - return 0 - -/proc/ToRban_autoupdate() - var/savefile/F = new(TORFILE) - if(F) - var/last_update - F["last_update"] >> last_update - if((last_update + TOR_UPDATE_INTERVAL) < world.realtime) //we haven't updated for a while - ToRban_update() - return - -/proc/ToRban_update() - spawn(0) - log_world("Downloading updated ToR data...") - var/http[] = world.Export("http://exitlist.torproject.org/exit-addresses") - - var/list/rawlist = file2list(http["CONTENT"]) - if(rawlist.len) - fdel(TORFILE) - var/savefile/F = new(TORFILE) - for( var/line in rawlist ) - if(!line) continue - if( copytext(line,1,12) == "ExitAddress" ) - var/cleaned = copytext(line,13,length(line)-19) - if(!cleaned) continue - F[cleaned] << 1 - to_chat(F["last_update"], world.realtime) - log_world("ToR data updated!") - if(usr) - to_chat(usr, "ToRban updated.") - return 1 - log_world("ToR data update aborted: no data.") - return 0 - -/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find")) - set name = "ToRban" - set category = "Server" - if(!holder) return - switch(task) - if("update") - ToRban_update() - if("toggle") - if(config) - if(config.ToRban) - config.ToRban = 0 - message_admins("ToR banning disabled.") - else - config.ToRban = 1 - message_admins("ToR banning enabled.") - if("show") - var/savefile/F = new(TORFILE) - var/dat - if( length(F.dir) ) - for( var/i=1, i<=length(F.dir), i++ ) - dat += "" - dat = "
#[i] [F.dir[i]]
[dat]
" - else - dat = "No addresses in list." - src << browse(dat,"window=ToRban_show") - if("remove") - var/savefile/F = new(TORFILE) - var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir - if(choice) - F.dir.Remove(choice) - to_chat(src, "Address removed") - if("remove all") - to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.") - if("find") - var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text - if(input) - if(ToRban_isbanned(input)) - to_chat(src, "Address is a known ToR address") - else - to_chat(src, "Address is not a known ToR address") - return - -#undef TORFILE -#undef TOR_UPDATE_INTERVAL diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f892d015da2..f310a4502fa 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -125,7 +125,6 @@ GLOBAL_LIST_INIT(admin_verbs_spawn, list( /client/proc/admin_deserialize )) GLOBAL_LIST_INIT(admin_verbs_server, list( - /client/proc/ToRban, /client/proc/Set_Holiday, /datum/admins/proc/startnow, /datum/admins/proc/restart, diff --git a/config/example/config.txt b/config/example/config.txt index 5934ea733b5..3a56570a03d 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -277,9 +277,6 @@ TICKLAG 0.5 ## Whether the server will talk to other processes through socket_talk SOCKET_TALK 0 -## Uncomment this to ban use of ToR -#TOR_BAN - ## Comment this out to disable automuting #AUTOMUTE_ON diff --git a/paradise.dme b/paradise.dme index 70c17c96107..b59a1d75541 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1197,7 +1197,6 @@ #include "code\modules\admin\sql_notes.dm" #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" #include "code\modules\admin\watchlist.dm" #include "code\modules\admin\DB ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" From 50c531eca17bc1dda87fec47f7a5c623e037049c Mon Sep 17 00:00:00 2001 From: Deelite34 Date: Thu, 30 Jul 2020 15:56:59 +0200 Subject: [PATCH 089/111] Update talisman.dm --- code/game/gamemodes/cult/talisman.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 60d2a7ff73b..492d128e222 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -4,7 +4,7 @@ var/cultist_name = "talisman" var/cultist_desc = "A basic talisman. It serves no purpose." var/invocation = "Naise meam!" - info = "


" + info = "


" var/uses = 1 var/health_cost = 0 //The amount of health taken from the user when invoking the talisman From ee20789548e9039303d5c689ac7012d08a599f56 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Fri, 31 Jul 2020 05:05:07 +0100 Subject: [PATCH 090/111] Fixed the [DREAMER] issue. Thanks to SteelSlayer for the help. --- code/modules/flufftext/Dreaming.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index d4c06fdc3a3..a24b73ae56c 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -19,7 +19,7 @@ var/list/newlist = dreamlist.Copy() for(var/i in 1 to newlist.len) newlist[i] = replacetext(newlist[i], "\[DREAMER\]", "[user.name]") - return dreamlist + return newlist //NIGHTMARES From a1c01f80518c5eb6ad0112207673707dc29a1908 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Fri, 31 Jul 2020 05:05:56 +0100 Subject: [PATCH 091/111] Capitalised AI --- config/names/dreams.txt | 2 +- config/names/nightmares.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/names/dreams.txt b/config/names/dreams.txt index 89f559dae88..4bd2c2b984e 100644 --- a/config/names/dreams.txt +++ b/config/names/dreams.txt @@ -105,7 +105,7 @@ a grey a kidan a diona a drask -the ai core +the AI core the mining station the research station a beaker of strange liquid diff --git a/config/names/nightmares.txt b/config/names/nightmares.txt index 71df2e90cff..022a0494edd 100644 --- a/config/names/nightmares.txt +++ b/config/names/nightmares.txt @@ -10,7 +10,7 @@ a dead grey a dead kidan a dead diona a dead drask -the malf ai core +the malf AI core bLoOd has been called a horrible sense of dread comes over you From 7e35fc9660ad9a6fff040732578d63ddeed1be40 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 31 Jul 2020 10:42:27 +0200 Subject: [PATCH 092/111] Fixes the runtime warning where secbots from spawning in null space --- code/modules/mob/living/simple_animal/bot/construction.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 024e2b5f304..d7e69c25c16 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -474,7 +474,7 @@ return build_step++ to_chat(user, "You complete the Securitron! Beep boop.") - var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot + var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot(loc) S.forceMove(get_turf(src)) S.name = created_name S.robot_arm = robot_arm @@ -512,7 +512,7 @@ //General Griefsky else if((istype(I, /obj/item/wrench)) && (build_step == 3)) - var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly + var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly(loc) user.put_in_hands(A) to_chat(user, "You adjust the arm slots for extra weapons!.") user.unEquip(src, 1) From a9d06b8538a7e4fcf867ae2774a16faa3f25937d Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 31 Jul 2020 10:45:38 +0200 Subject: [PATCH 093/111] better fix and fix griefsky as well --- .../modules/mob/living/simple_animal/bot/construction.dm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index d7e69c25c16..2dedbb2b99b 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -474,8 +474,7 @@ return build_step++ to_chat(user, "You complete the Securitron! Beep boop.") - var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot(loc) - S.forceMove(get_turf(src)) + var/mob/living/simple_animal/bot/secbot/S = new /mob/living/simple_animal/bot/secbot(get_turf(src)) S.name = created_name S.robot_arm = robot_arm qdel(I) @@ -540,8 +539,7 @@ if(!user.unEquip(I)) return to_chat(user, "You complete General Griefsky!.") - var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky - S.forceMove(get_turf(src)) + var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky(get_turf(src)) qdel(I) qdel(src) @@ -556,8 +554,7 @@ if(!user.unEquip(I)) return to_chat(user, "You complete Genewul Giftskee!.") - var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy - S.forceMove(get_turf(src)) + var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy(get_turf(src)) qdel(I) qdel(src) From f374993775a05f0dd8737514ac2ab1c053c57456 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 31 Jul 2020 12:06:36 +0200 Subject: [PATCH 094/111] Remove the unused vars --- code/modules/mob/living/simple_animal/bot/construction.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 2dedbb2b99b..e18672ffa20 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -511,7 +511,7 @@ //General Griefsky else if((istype(I, /obj/item/wrench)) && (build_step == 3)) - var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly(loc) + var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly(get_turf(src)) user.put_in_hands(A) to_chat(user, "You adjust the arm slots for extra weapons!.") user.unEquip(src, 1) @@ -539,7 +539,7 @@ if(!user.unEquip(I)) return to_chat(user, "You complete General Griefsky!.") - var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky(get_turf(src)) + new /mob/living/simple_animal/bot/secbot/griefsky(get_turf(src)) qdel(I) qdel(src) @@ -554,7 +554,7 @@ if(!user.unEquip(I)) return to_chat(user, "You complete Genewul Giftskee!.") - var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy(get_turf(src)) + new /mob/living/simple_animal/bot/secbot/griefsky/toy(get_turf(src)) qdel(I) qdel(src) From f5a74a7c190e20c5097d3d460eb14744b814e268 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Fri, 31 Jul 2020 10:43:33 -0500 Subject: [PATCH 095/111] tracker fix --- code/modules/power/tracker.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index c8964c7ec34..621c5f02747 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -29,10 +29,10 @@ //set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST /obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC) if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST)) - return 0 + return FALSE control = SC SC.connected_tracker = src - return 1 + return TRUE //set the control of the tracker to null and removes it from the previous control computer if needed /obj/machinery/power/tracker/proc/unset_control() @@ -44,7 +44,7 @@ if(!S) S = new /obj/item/solar_assembly(src) S.glass_type = /obj/item/stack/sheet/glass - S.tracker = 1 + S.tracker = TRUE S.anchored = TRUE S.forceMove(src) update_icon() @@ -63,7 +63,7 @@ . = TRUE if(!I.tool_use_check(user, 0)) return - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off the solar tracker.") if(I.use_tool(src, user, 50, volume = I.tool_volume)) user.visible_message("[user] takes the glass off the tracker.") @@ -76,7 +76,7 @@ stat |= BROKEN unset_control() -/obj/machinery/power/solar/deconstruct(disassembled = TRUE) +/obj/machinery/power/tracker/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) if(disassembled) var/obj/item/solar_assembly/S = locate() in src @@ -85,8 +85,8 @@ S.give_glass(stat & BROKEN) else playsound(src, "shatter", 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) + new /obj/item/shard(loc) + new /obj/item/shard(loc) qdel(src) // Tracker Electronic From b2b42d10fd9b2d96b9dfcd8d5069a128bd0c1914 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 31 Jul 2020 14:08:30 -0700 Subject: [PATCH 096/111] updates comment --- code/modules/reagents/reagent_containers/glass_containers.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 1ab6a1c2511..b2a25f5f8c0 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -48,8 +48,7 @@ reagents.clear_reagents() else if(!iscarbon(M)) - // This is a simple mob, or some other kind of mob that cannot process reagents. - // It makes no sense to inject reagents into mobs that don't even process them. + // Non-carbons can't process reagents to_chat(user, "You cannot find a way to feed [M].") return if(M != user) From 4e676f30c7a94250441a46758fffa73aae4ec267 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 31 Jul 2020 14:09:01 -0700 Subject: [PATCH 097/111] inline --- code/modules/reagents/reagent_containers/glass_containers.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index b2a25f5f8c0..175ae757df4 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -47,8 +47,7 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() else - if(!iscarbon(M)) - // Non-carbons can't process reagents + if(!iscarbon(M)) // Non-carbons can't process reagents to_chat(user, "You cannot find a way to feed [M].") return if(M != user) From e126d2d8cf7f96f3b68547d05dcedec4183f1e12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2020 12:51:34 -0600 Subject: [PATCH 098/111] Bump elliptic from 6.5.2 to 6.5.3 in /nano (#13973) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- nano/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nano/package-lock.json b/nano/package-lock.json index b96939c5d9a..14642f304d6 100644 --- a/nano/package-lock.json +++ b/nano/package-lock.json @@ -1728,9 +1728,9 @@ "dev": true }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", From d49c2cbcabd9e4b0909dd161fdb5267ae3d6e70f Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 1 Aug 2020 12:29:13 -0700 Subject: [PATCH 099/111] Fixes runtime in cryopod.dm:310 --- code/game/machinery/cryopod.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 36196ea4eca..2e0c4c54375 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -302,6 +302,7 @@ // Eject dead people if(occupant.stat == DEAD) go_out() + return // Allow a gap between entering the pod and actually despawning. if(world.time - time_entered < time_till_despawn) From 45ccab31a3271d8c64996cbbb64333704bc69b21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2020 03:50:05 +0000 Subject: [PATCH 100/111] Bump elliptic from 6.5.2 to 6.5.3 in /tgui Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3) Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 8cc9b0c818e..84cab5eb253 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -1241,9 +1241,9 @@ bluebird@^3.5.5: integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== body-parser@1.19.0: version "1.19.0" @@ -2198,9 +2198,9 @@ electron-to-chromium@^1.3.390: integrity sha512-DbCBdwtARI0l3e3m6ZIxVaTNahb6dSsmGjuag/twiVcWuM4MSpL5IfsJsJSyqLqxosE/m0CXlZaBmxegQW/dAg== elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" From 24d3698608daabeb160c82b5e729d0510e50139e Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Sun, 2 Aug 2020 10:39:15 -0500 Subject: [PATCH 101/111] Fixes bees turning invisible when you put a collar on them --- code/modules/mob/living/simple_animal/hostile/bees.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 3276416fe7f..3419279ffe5 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -95,6 +95,10 @@ for(var/mob/A in searched_for) . += A +// All bee sprites are made up of overlays. They do not have any special sprite overlays for items placed on them, such as collars, so this proc is unneeded. +/mob/living/simple_animal/hostile/poison/bees/regenerate_icons() + return + /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() From a2eb51c40e8ded78eb86d8a892e8d377ba7091b1 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Sun, 2 Aug 2020 18:33:44 +0300 Subject: [PATCH 102/111] Fix runtime in NewBan.dm when usr is bot --- code/modules/admin/NewBan.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 9aab12234d2..293504919d4 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -103,7 +103,8 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons GLOB.banlist_savefile.cd = "/base" if( GLOB.banlist_savefile.dir.Find("[ckey][computerid]") ) - to_chat(usr, "Ban already exists.") + if(usr) + to_chat(usr, "Ban already exists.") return 0 else GLOB.banlist_savefile.dir.Add("[ckey][computerid]") From 710c32553f464cd219e7018106a2b6b36edd3021 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Sun, 2 Aug 2020 21:16:56 +0300 Subject: [PATCH 103/111] Sanitize usr --- code/modules/admin/NewBan.dm | 6 +++--- code/modules/admin/sql_notes.dm | 24 ++++++++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 293504919d4..3e74c0854be 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -138,9 +138,9 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons log_admin("Ban Expired: [key]") message_admins("Ban Expired: [key]") else - ban_unban_log_save("[key_name_admin(usr)] unbanned [key]") - log_admin("[key_name_admin(usr)] unbanned [key]") - message_admins("[key_name_admin(usr)] unbanned: [key]") + ban_unban_log_save("[usr ? key_name_admin(usr) : "Bot"] unbanned [key]") + log_admin("[usr ? key_name_admin(usr) : "Bot"] unbanned [key]") + message_admins("[usr ? key_name_admin(usr) : "Bot"] unbanned: [key]") feedback_inc("ban_unban",1) usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) for(var/A in GLOB.banlist_savefile.dir) diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index a438a43eaec..5c73dda3beb 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -2,7 +2,8 @@ if(checkrights && !check_rights(R_ADMIN|R_MOD)) return if(!GLOB.dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection.") + if(usr) + to_chat(usr, "Failed to establish database connection.") return if(!target_ckey) @@ -19,7 +20,8 @@ log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") return if(!query_find_ckey.NextRow()) - to_chat(usr, "[target_ckey] has not been seen before, you can only add notes to known players.") + if(usr) + to_chat(usr, "[target_ckey] has not been seen before, you can only add notes to known players.") return var/exp_data = query_find_ckey.item[2] @@ -52,8 +54,8 @@ log_game("SQL ERROR adding new note to table. Error : \[[err]\]\n") return if(logged) - log_admin("[key_name(usr)] has added a note to [target_ckey]: [notetext]") - message_admins("[key_name_admin(usr)] has added a note to [target_ckey]:
[notetext]") + log_admin("[usr ? key_name(usr) : "Bot" ] has added a note to [target_ckey]: [notetext]") + message_admins("[usr ? key_name_admin(usr) : "Bot"] has added a note to [target_ckey]:
[notetext]") show_note(target_ckey) /proc/remove_note(note_id) @@ -63,7 +65,8 @@ var/notetext var/adminckey if(!GLOB.dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection.") + if(usr) + to_chat(usr, "Failed to establish database connection.") return if(!note_id) return @@ -82,15 +85,16 @@ var/err = query_del_note.ErrorMsg() log_game("SQL ERROR removing note from table. Error : \[[err]\]\n") return - log_admin("[key_name(usr)] has removed a note made by [adminckey] from [ckey]: [notetext]") - message_admins("[key_name_admin(usr)] has removed a note made by [adminckey] from [ckey]:
[notetext]") + log_admin("[usr ? key_name(usr) : "Bot" ] has removed a note made by [adminckey] from [ckey]: [notetext]") + message_admins("[usr ? key_name_admin(usr) : "Bot"] has removed a note made by [adminckey] from [ckey]:
[notetext]") show_note(ckey) /proc/edit_note(note_id) if(!check_rights(R_ADMIN|R_MOD)) return if(!GLOB.dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection.") + if(usr) + to_chat(usr, "Failed to establish database connection.") return if(!note_id) return @@ -117,8 +121,8 @@ var/err = query_update_note.ErrorMsg() log_game("SQL ERROR editing note. Error : \[[err]\]\n") return - log_admin("[key_name(usr)] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") - message_admins("[key_name_admin(usr)] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + log_admin("[usr ? key_name(usr) : "Bot" ] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + message_admins("[usr ? key_name_admin(usr) : "Bot"] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") show_note(target_ckey) /proc/show_note(target_ckey, index, linkless = 0) From 2f61e6b4bcc9068c471c62b91f5bccadaf0d1f45 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Sun, 2 Aug 2020 18:49:26 +0300 Subject: [PATCH 104/111] Fix runtime in Hallucination.dm when target.client is null --- code/modules/flufftext/Hallucination.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 905b629a0b9..78cda2c0f88 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -159,6 +159,8 @@ Gunshots/explosions/opening doors/less rare audio (done) next_expand = world.time + FAKE_FLOOD_EXPAND_TIME /obj/effect/hallucination/fake_flood/proc/Expand() + if(!target) + qdel(src) for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinal) var/turf/T = get_step(FT, dir) From b78530873ecacd9543fbd23a28e67bd0c410afb2 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Sun, 2 Aug 2020 23:34:55 +0300 Subject: [PATCH 105/111] Fix type of new nuke code in blob gamemode --- code/game/gamemodes/blob/blob_report.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 9c7fb99fe81..8f6ba965222 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -18,7 +18,7 @@ intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
" intercepttext += "Message ends." if(2) - var/nukecode = rand(10000, 99999) + var/nukecode = "[rand(10000, 99999)]" for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines) if(bomb && bomb.r_code) if(is_station_level(bomb.z)) From 5d779da274e68d567e7ffa2ed856701c26f1882f Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Mon, 3 Aug 2020 00:02:41 +0300 Subject: [PATCH 106/111] Better code --- code/modules/admin/NewBan.dm | 6 +++--- code/modules/admin/sql_notes.dm | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 3e74c0854be..293504919d4 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -138,9 +138,9 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons log_admin("Ban Expired: [key]") message_admins("Ban Expired: [key]") else - ban_unban_log_save("[usr ? key_name_admin(usr) : "Bot"] unbanned [key]") - log_admin("[usr ? key_name_admin(usr) : "Bot"] unbanned [key]") - message_admins("[usr ? key_name_admin(usr) : "Bot"] unbanned: [key]") + ban_unban_log_save("[key_name_admin(usr)] unbanned [key]") + log_admin("[key_name_admin(usr)] unbanned [key]") + message_admins("[key_name_admin(usr)] unbanned: [key]") feedback_inc("ban_unban",1) usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) for(var/A in GLOB.banlist_savefile.dir) diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 5c73dda3beb..4307fe57846 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -54,8 +54,8 @@ log_game("SQL ERROR adding new note to table. Error : \[[err]\]\n") return if(logged) - log_admin("[usr ? key_name(usr) : "Bot" ] has added a note to [target_ckey]: [notetext]") - message_admins("[usr ? key_name_admin(usr) : "Bot"] has added a note to [target_ckey]:
[notetext]") + log_admin("[usr ? key_name(usr) : adminckey] has added a note to [target_ckey]: [notetext]") + message_admins("[usr ? key_name_admin(usr) : adminckey] has added a note to [target_ckey]:
[notetext]") show_note(target_ckey) /proc/remove_note(note_id) @@ -85,8 +85,8 @@ var/err = query_del_note.ErrorMsg() log_game("SQL ERROR removing note from table. Error : \[[err]\]\n") return - log_admin("[usr ? key_name(usr) : "Bot" ] has removed a note made by [adminckey] from [ckey]: [notetext]") - message_admins("[usr ? key_name_admin(usr) : "Bot"] has removed a note made by [adminckey] from [ckey]:
[notetext]") + log_admin("[usr ? key_name(usr) : adminckey] has removed a note made by [adminckey] from [ckey]: [notetext]") + message_admins("[usr ? key_name_admin(usr) : adminckey] has removed a note made by [adminckey] from [ckey]:
[notetext]") show_note(ckey) /proc/edit_note(note_id) @@ -121,8 +121,8 @@ var/err = query_update_note.ErrorMsg() log_game("SQL ERROR editing note. Error : \[[err]\]\n") return - log_admin("[usr ? key_name(usr) : "Bot" ] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") - message_admins("[usr ? key_name_admin(usr) : "Bot"] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + log_admin("[usr ? key_name(usr) : adminckey] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + message_admins("[usr ? key_name_admin(usr) : adminckey] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") show_note(target_ckey) /proc/show_note(target_ckey, index, linkless = 0) From 372fd1ba818edf30038a8da539e83939a9e1f9b4 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Mon, 3 Aug 2020 00:13:03 +0300 Subject: [PATCH 107/111] Code improvements --- code/modules/flufftext/Hallucination.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 78cda2c0f88..21b99acb910 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -149,18 +149,18 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/fake_flood/process() if(!target) qdel(src) + return if(next_expand <= world.time) radius++ if(radius > FAKE_FLOOD_MAX_RADIUS) qdel(src) + return Expand() if((get_turf(target) in flood_turfs) && !target.internal) target.hallucinate("fake_alert", "too_much_tox") next_expand = world.time + FAKE_FLOOD_EXPAND_TIME /obj/effect/hallucination/fake_flood/proc/Expand() - if(!target) - qdel(src) for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinal) var/turf/T = get_step(FT, dir) From 9b1d61bdf966438f1c561e09ef249dadbd813e50 Mon Sep 17 00:00:00 2001 From: Bizzonium Date: Mon, 3 Aug 2020 00:28:50 +0300 Subject: [PATCH 108/111] Code improvements --- code/modules/admin/sql_notes.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm index 4307fe57846..04e28737479 100644 --- a/code/modules/admin/sql_notes.dm +++ b/code/modules/admin/sql_notes.dm @@ -85,8 +85,8 @@ var/err = query_del_note.ErrorMsg() log_game("SQL ERROR removing note from table. Error : \[[err]\]\n") return - log_admin("[usr ? key_name(usr) : adminckey] has removed a note made by [adminckey] from [ckey]: [notetext]") - message_admins("[usr ? key_name_admin(usr) : adminckey] has removed a note made by [adminckey] from [ckey]:
[notetext]") + log_admin("[usr ? key_name(usr) : "Bot"] has removed a note made by [adminckey] from [ckey]: [notetext]") + message_admins("[usr ? key_name_admin(usr) : "Bot"] has removed a note made by [adminckey] from [ckey]:
[notetext]") show_note(ckey) /proc/edit_note(note_id) @@ -121,8 +121,8 @@ var/err = query_update_note.ErrorMsg() log_game("SQL ERROR editing note. Error : \[[err]\]\n") return - log_admin("[usr ? key_name(usr) : adminckey] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") - message_admins("[usr ? key_name_admin(usr) : adminckey] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + log_admin("[usr ? key_name(usr) : "Bot"] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") + message_admins("[usr ? key_name_admin(usr) : "Bot"] has edited [target_ckey]'s note made by [adminckey] from \"[old_note]\" to \"[new_note]\"") show_note(target_ckey) /proc/show_note(target_ckey, index, linkless = 0) From 598388b38cd4eb2b1f4912b0810f7ebd43dbab6d Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Mon, 3 Aug 2020 05:22:56 +0000 Subject: [PATCH 109/111] Fixes a cause of "Runtime in ,:" (#13976) Co-authored-by: Kyep --- code/datums/mind.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 2f22e58d37b..103865bee94 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1419,9 +1419,10 @@ return A /datum/mind/proc/announce_objectives() - to_chat(current, "Your current objectives:") - for(var/line in splittext(gen_objective_text(), "
")) - to_chat(current, line) + if(current) + to_chat(current, "Your current objectives:") + for(var/line in splittext(gen_objective_text(), "
")) + to_chat(current, line) /datum/mind/proc/find_syndicate_uplink() var/list/L = current.get_contents() From 12c031760afb2df1bd988dcffc522b22fb1da131 Mon Sep 17 00:00:00 2001 From: Aziz Chynaliev Date: Mon, 3 Aug 2020 08:28:39 +0300 Subject: [PATCH 110/111] Fix runtime when 'item' is null during surgery germs spreading (#13975) * Fix runtime when 'item' is null during germs spreading * Change explicit null check to implicit * Oops --- code/modules/surgery/surgery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 0b13d18f9da..b66ec2d8aaf 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -196,7 +196,7 @@ if(AStar(E.loc, M.loc, /turf/proc/Distance, 2, simulated_only = 0)) germs++ - if(tool.blood_DNA && tool.blood_DNA.len) //germs from blood-stained tools + if(tool && tool.blood_DNA && tool.blood_DNA.len) //germs from blood-stained tools germs += 30 if(E.internal_organs.len) From f3d2c5ea424917db53a3ea628d23e371b7f2482b Mon Sep 17 00:00:00 2001 From: CornMyCob Date: Thu, 6 Aug 2020 12:26:28 +0100 Subject: [PATCH 111/111] fixes exploit --- code/game/objects/structures/girders.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 5fea799ecb0..6d27b21e686 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -76,14 +76,14 @@ if(istype(W,/obj/item/stack/rods)) var/obj/item/stack/rods/S = W if(state == GIRDER_DISPLACED) - if(S.get_amount() < 2) - to_chat(user, "You need at least two rods to create a false wall!") + if(S.get_amount() < 5) + to_chat(user, "You need at least five rods to create a false wall!") return to_chat(user, "You start building a reinforced false wall...") if(do_after(user, 20, target = src)) - if(!loc || !S || S.get_amount() < 2) + if(!loc || !S || S.get_amount() < 5) return - S.use(2) + S.use(5) to_chat(user, "You create a false wall. Push on it to open or close the passage.") var/obj/structure/falsewall/iron/FW = new (loc) transfer_fingerprints_to(FW)