From 9b528fc8d239c7b2e8475851361447150dcc0d2e Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:51:51 -0500 Subject: [PATCH 01/37] add rate limit on trigger --- .../junon-io/server/entities/event_handler.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/junon-io/server/entities/event_handler.js b/packages/junon-io/server/entities/event_handler.js index f7a0b468..dbee3522 100644 --- a/packages/junon-io/server/entities/event_handler.js +++ b/packages/junon-io/server/entities/event_handler.js @@ -21,6 +21,7 @@ class EventHandler { this.isRoundStarted = false this.isRoundStarting = false this.processingEvents = new Set() // Track events currently being processed to prevent infinite loops + this.processingOverflow = 0 } getSocketUtil() { @@ -970,9 +971,18 @@ class EventHandler { // Prevent infinite loops by checking if this event is already being processed // disable for now. need to fix to handle nested events - // if (this.processingEvents.has(eventKey)) { - // return - // } + if (this.processingEvents.has(eventKey)) { + if(this.processingOverflow >= 30){ + const counter = new Error("possible lag machine detected") + // throw a range error in anticipation of range error... + counter.name = "RangeError" + throw counter + return + } + else{ + this.processingOverflow++ + } + } // Mark this event as being processed this.processingEvents.add(eventKey) @@ -1027,6 +1037,7 @@ class EventHandler { resetProcessingEvents() { this.processingEvents.clear() + this.processingOverflow = 0 } updateTaskCompleted() { From d347bb2ae5340991a09ea954d9e06c277297d781 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:53:34 -0500 Subject: [PATCH 02/37] add handling for range error --- packages/junon-io/server/entities/game.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/junon-io/server/entities/game.js b/packages/junon-io/server/entities/game.js index 6b851b89..f32adc05 100644 --- a/packages/junon-io/server/entities/game.js +++ b/packages/junon-io/server/entities/game.js @@ -255,6 +255,7 @@ class Game { const args = tokens.filter((token) => { return token.length > 0 }) const command = this.commands[commandName] if (!command) return + if (!this.isGameReady) return if (delay > 0 && command.isDelayable()) { let timestampDelay = delay * Constants.physicsTimeStep @@ -1037,7 +1038,19 @@ class Game { triggerEvent(eventName, params = {}) { if (!this.isGameReady) return - this.sector && this.sector.eventHandler.trigger(eventName, params) + try + { + this.sector && this.sector.eventHandler.trigger(eventName, params) + } + catch(e) + { + if(e.name === "RangeError"){ + // disable processing more triggers + this.isGameReady = false + throw new Error("possible lag machine detected") + } + + } } addTimer(timer) { From 23d0c71621af97cf6a8bd4ec5fddc9ed6f21dee5 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:17:04 -0500 Subject: [PATCH 03/37] fix fire not disappearing when cleared fire would stay when removed via /clear --- packages/junon-io/common/interfaces/taintable.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/junon-io/common/interfaces/taintable.js b/packages/junon-io/common/interfaces/taintable.js index 75ebcec2..20c2aeb6 100644 --- a/packages/junon-io/common/interfaces/taintable.js +++ b/packages/junon-io/common/interfaces/taintable.js @@ -247,9 +247,10 @@ Taintable.prototype = { removeEffect(effectName) { if (!this.effects) return + this.setEffectLevel(effectName, 0) - delete this.effects[effectName] - this.onEffectRemoved(effectName) + // delete this.effects[effectName] + // this.onEffectRemoved(effectName) }, removeAllEffects() { @@ -278,4 +279,3 @@ Taintable.prototype = { } module.exports = Taintable - From 2ae701aec10b0e7e3aa1fecd8c4ab0097cd6ceeb Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:07:17 -0500 Subject: [PATCH 04/37] add limit to collision correction for edgify --- packages/junon-io/server/entities/base_entity.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/junon-io/server/entities/base_entity.js b/packages/junon-io/server/entities/base_entity.js index ea1c174f..b5b3aaa6 100644 --- a/packages/junon-io/server/entities/base_entity.js +++ b/packages/junon-io/server/entities/base_entity.js @@ -986,10 +986,12 @@ class BaseEntity extends BaseTransientEntity { if (tileHit.entity === null) return const otherBox = this.getTileBoxForEdgify(tileHit) const position = this.getPositionToEdgify(body) + // limit correction force so golems don't get stuck + let correction = body.entity.getWidth() >= 64 ? 32 : body.entity.getWidth() / 2 if (body.velocity[0] < 0) { // going left - position[0] = otherBox.pos.x + otherBox.w + + body.entity.getWidth() / 2 + position[0] = otherBox.pos.x + otherBox.w + correction // body.entity.getWidth() / 2 } else if (body.velocity[0] > 0) { // going right - position[0] = otherBox.pos.x - body.entity.getWidth() / 2 + position[0] = otherBox.pos.x - correction // body.entity.getWidth() / 2 } this.postEdgify(body) @@ -1000,10 +1002,11 @@ class BaseEntity extends BaseTransientEntity { if (tileHit.entity === null) return const otherBox = this.getTileBoxForEdgify(tileHit) const position = this.getPositionToEdgify(body) + let correction = body.entity.getWidth() >= 64 ? 32 : body.entity.getWidth() / 2 if (body.velocity[1] < 0) { // going up - position[1] = otherBox.pos.y + otherBox.h + body.entity.getHeight() / 2 + position[1] = otherBox.pos.y + otherBox.h + correction // body.entity.getHeight() / 2 } else if (body.velocity[1] > 0) { // going down - position[1] = otherBox.pos.y - body.entity.getHeight() / 2 // we're setting center of body, so accomodate its on width/height + position[1] = otherBox.pos.y - correction // body.entity.getHeight() / 2 // we're setting center of body, so accomodate its on width/height } this.postEdgify(body) From 0a22dee7a69075324e22de23e959650d2c65f6d3 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:32:25 -0500 Subject: [PATCH 05/37] add isCooked tag for foods so client and server can access from constants --- packages/junon-io/common/constants.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/junon-io/common/constants.json b/packages/junon-io/common/constants.json index ee6b975b..a0d82e6f 100644 --- a/packages/junon-io/common/constants.json +++ b/packages/junon-io/common/constants.json @@ -2731,6 +2731,7 @@ "Gelatin": { "width": 24, "height": 24, + "isCooked": true, "cost": { "gold": 15 }, @@ -2799,6 +2800,7 @@ "AnimalMeat": { "width": 24, "height": 24, + "isCooked": true, "isIngredient": true, "cost": { "gold": 15 @@ -2819,6 +2821,7 @@ "HotDog": { "width": 24, "height": 24, + "isCooked": true, "sprite": { "position": { "x": 60, @@ -2841,6 +2844,7 @@ "Bread": { "width": 24, "height": 24, + "isCooked": true, "isIngredient": true, "sprite": { "position": { @@ -2864,6 +2868,7 @@ "VeganPizza": { "width": 40, "height": 40, + "isCooked": true, "sprite": { "position": { "x": 95, @@ -2886,6 +2891,7 @@ "SlimyMeatPizza": { "width": 40, "height": 40, + "isCooked": true, "cost": { "gold": 500 }, @@ -2908,6 +2914,7 @@ "LectersDinner": { "width": 40, "height": 40, + "isCooked": true, "cost": { "gold": 300 }, @@ -2951,6 +2958,7 @@ "Potato": { "width": 24, "height": 24, + "isCooked": true, "isIngredient": true, "cost": { "gold": 150 @@ -3033,6 +3041,7 @@ "Fries": { "width": 24, "height": 24, + "isCooked": true, "cost": { "gold": 100 }, @@ -3056,6 +3065,7 @@ "Steak": { "width": 24, "height": 24, + "isCooked": true, "cost": { "gold": 200 }, @@ -3098,6 +3108,7 @@ "PotatoSoup": { "width": 32, "height": 32, + "isCooked": true, "cost": { "gold": 200 }, @@ -3118,6 +3129,7 @@ "SlimeBroth": { "width": 32, "height": 32, + "isCooked": true, "cost": { "gold": 200 }, @@ -3137,6 +3149,7 @@ "MisoSoup": { "width": 32, "height": 32, + "isCooked": true, "cost": { "gold": 200 }, @@ -3156,6 +3169,7 @@ "Omelette": { "width": 24, "height": 24, + "isCooked": true, "cost": { "gold": 200 }, @@ -3178,6 +3192,7 @@ "Nigiri": { "width": 24, "height": 24, + "isCooked": true, "cost": { "gold": 400 }, @@ -3202,6 +3217,7 @@ "PumpkinPie": { "width": 32, "height": 32, + "isCooked": true, "cost": { "gold": 250 }, From bdc0dcd1d06b57435c4dd34631b6a0eb30030a08 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:33:39 -0500 Subject: [PATCH 06/37] remove cooked tag from potato --- packages/junon-io/common/constants.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/junon-io/common/constants.json b/packages/junon-io/common/constants.json index a0d82e6f..8c66c18c 100644 --- a/packages/junon-io/common/constants.json +++ b/packages/junon-io/common/constants.json @@ -2958,7 +2958,6 @@ "Potato": { "width": 24, "height": 24, - "isCooked": true, "isIngredient": true, "cost": { "gold": 150 From ad06d465710c28514963fbe9ddf8ad9413806c26 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:34:56 -0500 Subject: [PATCH 07/37] add function to check if food is cooked --- packages/junon-io/server/entities/item.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/junon-io/server/entities/item.js b/packages/junon-io/server/entities/item.js index 39e8b4f9..63d9c4d0 100644 --- a/packages/junon-io/server/entities/item.js +++ b/packages/junon-io/server/entities/item.js @@ -176,6 +176,12 @@ class Item extends BaseTransientEntity { return klass.prototype.getConstants().isIngredient } + isFoodCooked() { + let klass = this.getKlass(this.type) + if (!klass) return false + return klass.prototype.getConstants().isCooked + } + isNameTag() { const klass = this.getKlass(this.type) if (!klass) return false From 72b189a3e2cea8c386542ddaa169b29bbf08d9f5 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:37:16 -0500 Subject: [PATCH 08/37] fix non-stove items being cookable server fix since client isn't fool-proof --- packages/junon-io/server/entities/buildings/stove.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/junon-io/server/entities/buildings/stove.js b/packages/junon-io/server/entities/buildings/stove.js index 3348182a..8c0f49d8 100644 --- a/packages/junon-io/server/entities/buildings/stove.js +++ b/packages/junon-io/server/entities/buildings/stove.js @@ -105,7 +105,8 @@ class Stove extends BaseBuilding { onFoodReady() { try { let item = this.getDesiredFoodItem() - + if(!item.isFoodCooked) return + this.activeUser.setIsWorking(false) let isSuccessful @@ -169,4 +170,3 @@ class Stove extends BaseBuilding { } module.exports = Stove - From b16cf808f9d2e61abfa424fbe2ec228a44a08f00 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:37:58 -0500 Subject: [PATCH 09/37] remove cooked tag from animal meat --- packages/junon-io/common/constants.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/junon-io/common/constants.json b/packages/junon-io/common/constants.json index 8c66c18c..ed92a891 100644 --- a/packages/junon-io/common/constants.json +++ b/packages/junon-io/common/constants.json @@ -2800,7 +2800,6 @@ "AnimalMeat": { "width": 24, "height": 24, - "isCooked": true, "isIngredient": true, "cost": { "gold": 15 From 99d008846e78653246324f0289438d8bf95c7277 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:57:57 -0500 Subject: [PATCH 10/37] allow open/close to work on lamps --- packages/junon-io/server/commands/interact.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/junon-io/server/commands/interact.js b/packages/junon-io/server/commands/interact.js index 2dae1766..83ecc5dd 100644 --- a/packages/junon-io/server/commands/interact.js +++ b/packages/junon-io/server/commands/interact.js @@ -71,7 +71,7 @@ class Interact extends BaseCommand { } } - if (entity.hasCategory("door")) { + if (entity.hasCategory("door") || entity.hasCategory("lamp")) { if (operation === "open") { entity.open() } else if (operation === "close") { From f43f9d925304de68d9ca58ba278d929fac78e8e3 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:22:46 -0500 Subject: [PATCH 11/37] limit menu choice & fix closing menu also make it usable with cmd blocks --- packages/junon-io/server/commands/menu.js | 39 ++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/junon-io/server/commands/menu.js b/packages/junon-io/server/commands/menu.js index 2d837d63..312c4f0c 100644 --- a/packages/junon-io/server/commands/menu.js +++ b/packages/junon-io/server/commands/menu.js @@ -1,4 +1,6 @@ const BaseCommand = require("./base_command") +const Constants = require("../../common/constants") +const Protocol = require('../../common/util/protocol') class Menu extends BaseCommand { getUsage() { @@ -6,10 +8,29 @@ class Menu extends BaseCommand { "/menu close [menu name] [player name]", "/menu open [menu name] [player name]", "Available menu names:", - "keypadMenu, craftMenu, atmMenu, friendsMenu, commandBlockMenu, teamMenu, welcomeMenu, stoveMenu, tradeMenu, slaveTradeMenu, badgeMenu" + this.getAllowedMenus().join(", ") ] } + getAllowedMenus() + { + return ["blueprintMenu", + "inventoryMenu", + "chatMenu", + "tradeMenu", + "slaveTradeMenu", + "welcomeMenu", + "mapMenu", + "miniMapMenu", + "atmMenu", + "sidebarMenu", + "commandBlockMenu", + "voteMenu", + "friendsMenu", + "badgeMenu", + "teamMenu"] + } + allowOwnerOnly() { return true } @@ -19,7 +40,7 @@ class Menu extends BaseCommand { let menuName = args[1] let player = args[2] let multiplePlayers - if(!caller || !caller.isPlayer()) return + // if(!caller || !caller.isPlayer()) return if(player) { player = this.getPlayersBySelector(player) @@ -29,6 +50,16 @@ class Menu extends BaseCommand { } if(subcommand == "open") { + // only check allowed menus here + // since player shouldn't have entity-dependent menus open with this cmd + // but should be able to have them closed + let allowedMenus = this.getAllowedMenus() + if(allowedMenus.indexOf(menuName) === -1) + { + caller.showChatError("Menu invalid / unallowed: " + menuName) + return + } + if(multiplePlayers) { player.forEach((entity) => { this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) @@ -41,7 +72,7 @@ class Menu extends BaseCommand { if(subcommand == "close") { if(multiplePlayers) { player.forEach((entity) => { - this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) + this.getSocketUtil().emit(entity.socket, "CloseMenu", {menuName: menuName}) }) return } @@ -53,4 +84,4 @@ class Menu extends BaseCommand { } } -module.exports = Menu \ No newline at end of file +module.exports = Menu From ed54c3ab9753147b5005c2863e52a99f3dfc578c Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:34:54 -0500 Subject: [PATCH 12/37] add small_airlock.js on client --- .../src/entities/buildings/small_airlock.js | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 packages/junon-io/client/src/entities/buildings/small_airlock.js diff --git a/packages/junon-io/client/src/entities/buildings/small_airlock.js b/packages/junon-io/client/src/entities/buildings/small_airlock.js new file mode 100644 index 00000000..0acca4e0 --- /dev/null +++ b/packages/junon-io/client/src/entities/buildings/small_airlock.js @@ -0,0 +1,47 @@ +const Airlock = require("./airlock") +const Constants = require("./../../../../common/constants.json") +const Protocol = require("./../../../../common/util/protocol") + +class SmallAirlock extends Airlock { + + getConstantsTable() { + return "Buildings.SmallAirlock" + } + + open() { + this.tween = super.getOpenTween(Constants.tileSize * 1.5) + this.tween.start() + } + + getType() { + return Protocol.definition().BuildingType.SmallAirlock + } + + getBuildingSprite() { + let sprite = new PIXI.Container() + + let texture = PIXI.utils.TextureCache["small_airlock_upper.png"] + this.upperDoorSprite = new PIXI.Sprite(texture) + this.upperDoorSprite.anchor.set(0.5) + this.upperDoorSprite.name = "UpperDoor" + + texture = PIXI.utils.TextureCache["small_airlock_lower.png"] + this.lowerDoorSprite = new PIXI.Sprite(texture) + this.lowerDoorSprite.anchor.set(0.5) + this.lowerDoorSprite.name = "LowerDoor" + + sprite.addChild(this.lowerDoorSprite) + sprite.addChild(this.upperDoorSprite) + + return sprite + } + + getSpritePath() { + return "small_airlock.png" + } + + + +} + +module.exports = SmallAirlock From 28a53955f19ef61b1f2d5cc3c67f3a49dc29a2c5 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:35:44 -0500 Subject: [PATCH 13/37] add small_airlock.js on server --- .../entities/buildings/small_airlock.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 packages/junon-io/server/entities/buildings/small_airlock.js diff --git a/packages/junon-io/server/entities/buildings/small_airlock.js b/packages/junon-io/server/entities/buildings/small_airlock.js new file mode 100644 index 00000000..d219a6ea --- /dev/null +++ b/packages/junon-io/server/entities/buildings/small_airlock.js @@ -0,0 +1,30 @@ +const Airlock = require("./airlock") +const Constants = require('../../../common/constants.json') +const Protocol = require('../../../common/util/protocol') + +class SmallAirlock extends Airlock { + + getConstantsTable() { + return "Buildings.SmallAirlock" + } + + isAutomatic() { + return false + } + + getType() { + return Protocol.definition().BuildingType.SmallAirlock + } + + getDoorLengthDivisor() { + return 1 + } + + shouldObstruct(body, hit) { + return !this.isOpen + } + + +} + +module.exports = SmallAirlock From 2c7f588a722e87a6fded411bc32b4c9ce766cce7 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:38:27 -0500 Subject: [PATCH 14/37] add sprites for small airlock --- .../client/assets/images/small_airlock.png | Bin 0 -> 316 bytes .../client/assets/images/small_airlock_lower.png | Bin 0 -> 524 bytes .../client/assets/images/small_airlock_upper.png | Bin 0 -> 516 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/junon-io/client/assets/images/small_airlock.png create mode 100644 packages/junon-io/client/assets/images/small_airlock_lower.png create mode 100644 packages/junon-io/client/assets/images/small_airlock_upper.png diff --git a/packages/junon-io/client/assets/images/small_airlock.png b/packages/junon-io/client/assets/images/small_airlock.png new file mode 100644 index 0000000000000000000000000000000000000000..064131fb574b58c8284f358d68116764bf52ca61 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4j!ywFfJby(BP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprVtWE{-7)t#7Aq-OBS1uz$8RTlvQAxY2_U;hv>QEzb|kowetBQN^9vBG2Y9FD+ZLTD*bj z13!b0m**_!Pn;pAn}c307TV z6US52se6=xBsW8=O+!Fj@X5~(8tYev{9}*UIYXp@$$|F+Ly3vCaNibHJ)ox;JYD@< J);T3K0RSkse7FDr literal 0 HcmV?d00001 diff --git a/packages/junon-io/client/assets/images/small_airlock_lower.png b/packages/junon-io/client/assets/images/small_airlock_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..b224db15f78170dd6269f7fb6ee8964f17dd8575 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9Fx?I6t9|MX)jP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_s8No-U3d6?5LscJw>sAmO%u z+vRC2E*#cQmv#gc9A@tt8%#MW4ABj}ED78jCNktOnh7=N9&lsYzvFmH+WeLH#GZIEyVvr4nw6t2E&Q-gqZEDkce$d+-$@YrI-s=Itl_uU`- zeo<;IasR#|*ZWqj6&DgNKKf-aoxs8tVFrPyK?&QG*E8^L7k@ XU!8(0{L_1ZG0EWR>gTe~DWM4f$^qER literal 0 HcmV?d00001 diff --git a/packages/junon-io/client/assets/images/small_airlock_upper.png b/packages/junon-io/client/assets/images/small_airlock_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9f6d96b69f7317e53fbab932ffbc4beea312e9 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9Fx?I6t9|MX)jP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_s87o-U3d6?5LsI-A$zAmV19 zz#^=Bb%(OblJ2nG4_PaiGR*?Hp_l%XMS{4W}S7$o%A!|37dVh<^Q<^PO0#V-}1YMvq0*%+PzJ4%g)YV zxStp~4MhK|SQ5MY+xjip$5=WJF?d~mw#C%?2UV! ze^~0pFY_b!{2Nfc%d~;@h6e*MOkQ95r>l3KNfsO~dhcW|m_iM}5m3*V*KTo|xGMh> RKQIOvJYD@<);T3K0RSQB)PDc~ literal 0 HcmV?d00001 From df2f1ecc51fb55672a2610af82bdcd7df9909294 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:39:48 -0500 Subject: [PATCH 15/37] add sprites to tempAssets --- packages/junon-io/client/src/entities/game.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/junon-io/client/src/entities/game.js b/packages/junon-io/client/src/entities/game.js index d5a7f5d0..9c00f50c 100644 --- a/packages/junon-io/client/src/entities/game.js +++ b/packages/junon-io/client/src/entities/game.js @@ -1412,7 +1412,7 @@ class Game { // PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST - let tempAssets = ['displacement_map.png', 'squid_lord_heart.png', 'squid_staff.png', 'fries.png', 'energy_drink.png', 'alien_juice.png', 'rocket_launcher.png', 'scar_17_by_px.png', 'bowl_by_px.png', 'potato_soup_by_px.png', 'miso_soup_by_px.png', 'slime_broth_by_px.png', 'bomber_turret_by_px.png', 'firebat.png', 'plasma_blade.png', 'raven.png', 'starberries.png', 'car.png', 'bricks_texture.png', 'checker_texture.png', 'noise_texture.png', 'x_texture.png', 'xchecker_texture.png', 'nihonshu.png', 'pumpkin.png', 'pumpkin_plant.png', 'pumpkin_seed.png', 'rice.png', 'rice_plant.png', 'rice_seed.png', 'fish.png', 'nigiri.png', 'katana_reskin.png', 'pumpkin_pie.png', 'imperial_special_forces_armor.png', 'deconstructor.png', 'blue_laser.png', 'keypad_door.png', 'keypad_door_lower.png', 'keypad_door_upper.png', 'unbreakable_wall.png', 'sapper.png', 'sapper_corpse.png', 'dynamite.png', 'miasma_gate.png', "solid_texture2.png", "simplex_texture.png", "cabbage_seed.png", "cabbage_plant.png", "cabbage.png", "3dwall-0.png", "3dwall-1.png", "3dwall-2.png", "3dwall-3.png", "3dwall-4.png", "3dwall-5.png", "3dwall-6.png", "3dwall-7.png", "3dwall-8.png", "3dwall-9.png", "3dwall-10.png", "3dwall-11.png", "3dwall-12.png", "3dwall-13.png"] + let tempAssets = ['displacement_map.png', 'squid_lord_heart.png', 'squid_staff.png', 'fries.png', 'energy_drink.png', 'alien_juice.png', 'rocket_launcher.png', 'scar_17_by_px.png', 'bowl_by_px.png', 'potato_soup_by_px.png', 'miso_soup_by_px.png', 'slime_broth_by_px.png', 'bomber_turret_by_px.png', 'firebat.png', 'plasma_blade.png', 'raven.png', 'starberries.png', 'car.png', 'bricks_texture.png', 'checker_texture.png', 'noise_texture.png', 'x_texture.png', 'xchecker_texture.png', 'nihonshu.png', 'pumpkin.png', 'pumpkin_plant.png', 'pumpkin_seed.png', 'rice.png', 'rice_plant.png', 'rice_seed.png', 'fish.png', 'nigiri.png', 'katana_reskin.png', 'pumpkin_pie.png', 'imperial_special_forces_armor.png', 'deconstructor.png', 'blue_laser.png', 'keypad_door.png', 'keypad_door_lower.png', 'keypad_door_upper.png', 'unbreakable_wall.png', 'sapper.png', 'sapper_corpse.png', 'dynamite.png', 'miasma_gate.png', "solid_texture2.png", "simplex_texture.png", "cabbage_seed.png", "cabbage_plant.png", "cabbage.png", "3dwall-0.png", "3dwall-1.png", "3dwall-2.png", "3dwall-3.png", "3dwall-4.png", "3dwall-5.png", "3dwall-6.png", "3dwall-7.png", "3dwall-8.png", "3dwall-9.png", "3dwall-10.png", "3dwall-11.png", "3dwall-12.png", "3dwall-13.png", "small_airlock_upper.png","small_airlock_lower.png","small_airlock.png"] tempAssets.forEach((asset) => { PIXI.Texture.addToCache(PIXI.Texture.fromImage('/assets/images/' + asset), asset) }) From 2f3ee3620d8e5520be7d2f4ce0159e89dd2ad3f5 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:43:33 -0500 Subject: [PATCH 16/37] add small airlock to constants --- packages/junon-io/common/constants.json | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/junon-io/common/constants.json b/packages/junon-io/common/constants.json index ed92a891..80cc6c2e 100644 --- a/packages/junon-io/common/constants.json +++ b/packages/junon-io/common/constants.json @@ -6049,19 +6049,33 @@ "description": "Airtight door. No power required to operate" }, "SmallAirlock": { - "width": 64, + "width": 32, "height": 32, + "isInteractable": true, + "showInteractTooltip": true, + "isUpgradable": true, + "isAirtight": true, + "categories": {"door":true,"melee_resistant":true}, + "minimapColor": "#3bceaa", + "requirements": { + "IronBar": 5 + }, "cost": { "gold": 50 }, + "sprite":{ + "width": 32, + "height": 32 + }, "stats": { "health": 100, "count": 125 }, "upgrade": { - "health": "+25", - "count": "+25" - } + "health": "+15", + "count": "+15" + }, + "description":"A smaller airtight door." }, "ResearchTable": { "width": 32, From fe2c56a56180d26b0dcc915b00ade6fbef5e8424 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:48:49 -0500 Subject: [PATCH 17/37] add small airlock to enum --- packages/junon-common/protocol/enum.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/junon-common/protocol/enum.proto b/packages/junon-common/protocol/enum.proto index 90df3900..de67defa 100644 --- a/packages/junon-common/protocol/enum.proto +++ b/packages/junon-common/protocol/enum.proto @@ -266,6 +266,7 @@ enum BuildingType { MiasmaGate = 272; CabbageSeed = 273; Cabbage = 274; + SmallAirlock = 275; } enum TerrainType { From d6f5de6b78eca6d17a0f2a2eda0fdc1d760486ac Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:49:41 -0500 Subject: [PATCH 18/37] add small airlock to index on server --- packages/junon-io/server/entities/buildings/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/junon-io/server/entities/buildings/index.js b/packages/junon-io/server/entities/buildings/index.js index bd765076..16bfff45 100644 --- a/packages/junon-io/server/entities/buildings/index.js +++ b/packages/junon-io/server/entities/buildings/index.js @@ -29,6 +29,7 @@ Buildings.SealedDoor = require("./sealed_door") Buildings.KeypadDoor = require("./keypad_door") Buildings.Airlock = require("./airlock") Buildings.ManualAirlock = require("./manual_airlock") +Buildings.SmallAirlock = require("./small_airlock") Buildings.SolarPanel = require("./solar_panel") Buildings.OxygenTank = require("./oxygen_tank") Buildings.SmallOxygenTank = require("./small_oxygen_tank") From 0446f7682e04ced5e513f593f98738e61e4f20eb Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:52:30 -0500 Subject: [PATCH 19/37] add small airlock to index on client --- packages/junon-io/client/src/entities/buildings/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/junon-io/client/src/entities/buildings/index.js b/packages/junon-io/client/src/entities/buildings/index.js index 01fcb020..9625c2bc 100644 --- a/packages/junon-io/client/src/entities/buildings/index.js +++ b/packages/junon-io/client/src/entities/buildings/index.js @@ -32,6 +32,7 @@ Buildings.Production.AmmoPrinter = require("./ammo_printer") Buildings.Structures.SpikeTrap = require("./spike_trap") Buildings.Structures.WebTrap = require("./web_trap") Buildings.Structures.ManualAirlock = require("./manual_airlock") +Buildings.Structures.SmallAirlock = require("./small_airlock") Buildings.Structures.Airlock = require("./airlock") Buildings.Structures.SealedDoor = require("./sealed_door") Buildings.Structures.Fence = require("./fence") From c38281a4a4b01755f170af3b99efd270457d652a Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Sat, 4 Jul 2026 12:51:01 -0500 Subject: [PATCH 20/37] increase threshold limit adjusted for some colonies, should still auto-remove lag machines though --- packages/junon-io/server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/junon-io/server/server.js b/packages/junon-io/server/server.js index 58036603..f453b042 100644 --- a/packages/junon-io/server/server.js +++ b/packages/junon-io/server/server.js @@ -1261,7 +1261,7 @@ class Server { game.sendUpdates() let endProcessTime = (new Date()).getTime() // remove worlds that are likely too resource-intensive - if(endProcessTime - startProcessTime >= 300){ + if(endProcessTime - startProcessTime >= 500){ game.forEachPlayer((player) => { if (player.socket) player.socket.close() player.remove() From af78da7e232e2ff361b5be4968b9d8481d563734 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:18:13 -0500 Subject: [PATCH 21/37] fix player light not updating correctly wouldn't follow other players or disappear on leave --- packages/junon-io/client/src/entities/player.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/junon-io/client/src/entities/player.js b/packages/junon-io/client/src/entities/player.js index a52b15cf..3c5f144d 100644 --- a/packages/junon-io/client/src/entities/player.js +++ b/packages/junon-io/client/src/entities/player.js @@ -1117,6 +1117,7 @@ class Player extends BaseEntity { this.registerToChunk() this.repositionOnUnitMap() + this.redrawVisionLightSprite() if (this.isMe()) { if (this.sector.isFovMode()) { @@ -1125,7 +1126,6 @@ class Player extends BaseEntity { } this.highlightNearbyEntities() - this.redrawVisionLightSprite() this.updateSelectedEntity() if (options.isGridPositionChanged) { @@ -1415,6 +1415,11 @@ class Player extends BaseEntity { this.usernameText.remove() } + if (this.visionLightSprite){ + this.visionLightSprite.destroy() + this.visionLightCanvas.remove() + } + this.getContainer().unregisterEntity("players", this) if (this.chunk) { From 49bc488b69f96094f468b2bdef9a59245a7f8e46 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:46:25 -0500 Subject: [PATCH 22/37] cleanup excessive decimals in position if present thanks how.was.the.fall for the fix --- packages/junon-io/server/entities/base_entity.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/junon-io/server/entities/base_entity.js b/packages/junon-io/server/entities/base_entity.js index b5b3aaa6..7c1f4116 100644 --- a/packages/junon-io/server/entities/base_entity.js +++ b/packages/junon-io/server/entities/base_entity.js @@ -652,6 +652,9 @@ class BaseEntity extends BaseTransientEntity { if (x > this.sector.getGridWidth()) x = this.sector.getGridWidth() - 1 if (y > this.sector.getGridHeight()) y = this.sector.getGridHeight() - 1 const prevChunk = { row: this.getChunkRow(), col: this.getChunkCol() } + + x = Math.round(coord * Constants.tileSize) / Constants.tileSize + y = Math.round(coord * Constants.tileSize) / Constants.tileSize this.setPositionInternal(x, y) From e5fdd1015019fbeb046115d985ceb49e29880607 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:33:08 -0500 Subject: [PATCH 23/37] prevent non-armors from being stored in suit station --- .../junon-io/server/entities/buildings/suit_station.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/junon-io/server/entities/buildings/suit_station.js b/packages/junon-io/server/entities/buildings/suit_station.js index ee8e8c1f..7c7ab9ad 100644 --- a/packages/junon-io/server/entities/buildings/suit_station.js +++ b/packages/junon-io/server/entities/buildings/suit_station.js @@ -127,6 +127,15 @@ class SuitStation extends BaseBuilding { return item.isArmor() } + store(item) { + // to prevent non-armors from being stored + if(item.isArmor()) { + super.store(item) + } else { + return + } + } + onStorageChanged(item, index) { super.onStorageChanged(item, index) From 97c0f034f5d6165e5e0ddb12a72c7bc740a7c1dc Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:34:31 -0500 Subject: [PATCH 24/37] fix issue with multiple suits appearing in suit station --- .../junon-io/client/src/entities/buildings/suit_station.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/junon-io/client/src/entities/buildings/suit_station.js b/packages/junon-io/client/src/entities/buildings/suit_station.js index 0b342ada..1160c311 100644 --- a/packages/junon-io/client/src/entities/buildings/suit_station.js +++ b/packages/junon-io/client/src/entities/buildings/suit_station.js @@ -12,6 +12,8 @@ class SuitStation extends BaseBuilding { onContentChanged() { const armorType = this.content + // just remove armor when content change + if (this.armor) this.armor.remove() if (armorType) { let suitType = armorType.split(":")[0] let color = armorType.split(":")[1] @@ -22,9 +24,6 @@ class SuitStation extends BaseBuilding { } this.armor = Equipments.forType(suitType).build(this.game, data) - } else if (this.armor) { - // no more armor in storage, remove it - this.armor.remove() } } From 14514e61f9f0e5cf081de3867b270415bee55abe Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 17:04:26 -0500 Subject: [PATCH 25/37] fix placeholder values --- packages/junon-io/server/entities/base_entity.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/junon-io/server/entities/base_entity.js b/packages/junon-io/server/entities/base_entity.js index 7c1f4116..adf84122 100644 --- a/packages/junon-io/server/entities/base_entity.js +++ b/packages/junon-io/server/entities/base_entity.js @@ -653,8 +653,8 @@ class BaseEntity extends BaseTransientEntity { if (y > this.sector.getGridHeight()) y = this.sector.getGridHeight() - 1 const prevChunk = { row: this.getChunkRow(), col: this.getChunkCol() } - x = Math.round(coord * Constants.tileSize) / Constants.tileSize - y = Math.round(coord * Constants.tileSize) / Constants.tileSize + x = Math.round(x * Constants.tileSize) / Constants.tileSize + y = Math.round(y * Constants.tileSize) / Constants.tileSize this.setPositionInternal(x, y) From 018dca3e1a8f09fade83faa11652ee3607a7ce74 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 6 Jul 2026 18:00:10 -0500 Subject: [PATCH 26/37] prevent stove content from being non-food also fixed a typo --- .../junon-io/server/entities/buildings/stove.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/junon-io/server/entities/buildings/stove.js b/packages/junon-io/server/entities/buildings/stove.js index 8c0f49d8..437eab4d 100644 --- a/packages/junon-io/server/entities/buildings/stove.js +++ b/packages/junon-io/server/entities/buildings/stove.js @@ -1,5 +1,6 @@ const Constants = require('../../../common/constants.json') const Protocol = require('../../../common/util/protocol') +const Helper = require("./../../../common/helper") const BaseBuilding = require("./base_building") const Foods = require("./../foods/index") const ExceptionReporter = require('junon-common/exception_reporter') @@ -98,6 +99,14 @@ class Stove extends BaseBuilding { } } + setBuildingContent(content) { + let foodType = parseInt(content) + let foodKlass = Foods.forType(foodType) + // prevent invalid items from being cooked + if (!foodKlass) return + if (foodKlass.prototype.getConstants().isCooked) super.setBuildingContent(content) + } + getInteractDistance() { return Constants.tileSize * 2 } @@ -105,9 +114,9 @@ class Stove extends BaseBuilding { onFoodReady() { try { let item = this.getDesiredFoodItem() - if(!item.isFoodCooked) return - + this.activeUser.setIsWorking(false) + if(!item.isFoodCooked()) return let isSuccessful if (this.activeUser.isPlayer()) { From c11a53ef912d967a9a8172211d5a603bba8a469d Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Tue, 7 Jul 2026 11:10:59 -0500 Subject: [PATCH 27/37] increase rate limit --- packages/junon-io/server/entities/event_handler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/junon-io/server/entities/event_handler.js b/packages/junon-io/server/entities/event_handler.js index dbee3522..959e9243 100644 --- a/packages/junon-io/server/entities/event_handler.js +++ b/packages/junon-io/server/entities/event_handler.js @@ -972,7 +972,7 @@ class EventHandler { // Prevent infinite loops by checking if this event is already being processed // disable for now. need to fix to handle nested events if (this.processingEvents.has(eventKey)) { - if(this.processingOverflow >= 30){ + if(this.processingOverflow >= 1000){ const counter = new Error("possible lag machine detected") // throw a range error in anticipation of range error... counter.name = "RangeError" From 41f4ab1aa74e76c3910be69e5d4a2b3a595a34ef Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Tue, 7 Jul 2026 11:12:31 -0500 Subject: [PATCH 28/37] increase threshold limit adjusted for larger colonies --- packages/junon-io/server/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/junon-io/server/server.js b/packages/junon-io/server/server.js index f453b042..a81fb39d 100644 --- a/packages/junon-io/server/server.js +++ b/packages/junon-io/server/server.js @@ -1261,7 +1261,7 @@ class Server { game.sendUpdates() let endProcessTime = (new Date()).getTime() // remove worlds that are likely too resource-intensive - if(endProcessTime - startProcessTime >= 500){ + if(endProcessTime - startProcessTime >= 1200){ game.forEachPlayer((player) => { if (player.socket) player.socket.close() player.remove() From 2d2609eba65ecc0e5ee1917c5c8d47d9e8659a66 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:26:14 -0500 Subject: [PATCH 29/37] offload extraneous triggers to prevent server from being overwhelmed --- .../junon-io/server/entities/event_handler.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/junon-io/server/entities/event_handler.js b/packages/junon-io/server/entities/event_handler.js index 959e9243..93ae46d2 100644 --- a/packages/junon-io/server/entities/event_handler.js +++ b/packages/junon-io/server/entities/event_handler.js @@ -22,6 +22,7 @@ class EventHandler { this.isRoundStarting = false this.processingEvents = new Set() // Track events currently being processed to prevent infinite loops this.processingOverflow = 0 + this.PROCESSING_LIMIT = 25 } getSocketUtil() { @@ -972,16 +973,7 @@ class EventHandler { // Prevent infinite loops by checking if this event is already being processed // disable for now. need to fix to handle nested events if (this.processingEvents.has(eventKey)) { - if(this.processingOverflow >= 1000){ - const counter = new Error("possible lag machine detected") - // throw a range error in anticipation of range error... - counter.name = "RangeError" - throw counter - return - } - else{ - this.processingOverflow++ - } + this.processingOverflow++ } // Mark this event as being processed @@ -1084,7 +1076,11 @@ class EventHandler { } runAction(action, params) { - this.commandDelay = 0 // always reset command delay at beginning + if(this.processingOverflow > this.PROCESSING_LIMIT) { + this.commandDelay = 0.1 * (this.processingOverflow - this.PROCESSING_LIMIT) // offload if overwhelmed + } else { + this.commandDelay = 0 // always reset command delay at beginning + } if (action.timer) { if (action.timer.shouldRemove) { From d4e14b54b20b292d481e052dbaa3a9aba30760d0 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Mon, 13 Jul 2026 19:36:22 -0500 Subject: [PATCH 30/37] fix custom color txt not showing --- packages/junon-io/client/src/menus/entity_menu.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/junon-io/client/src/menus/entity_menu.js b/packages/junon-io/client/src/menus/entity_menu.js index b3d55c2e..043a524d 100644 --- a/packages/junon-io/client/src/menus/entity_menu.js +++ b/packages/junon-io/client/src/menus/entity_menu.js @@ -400,6 +400,7 @@ class EntityMenu extends BaseMenu { } this.el.querySelector(".entity_action").innerHTML = "" // reset + this.el.querySelector('.entity_color').innerText = "" if (this.game.shouldShowDebugDetails()) { @@ -425,7 +426,8 @@ class EntityMenu extends BaseMenu { const isFloorOrWall = entity.hasCategory && (entity.hasCategory('platform') || entity.hasCategory('wall') || entity.hasCategory('custom_colors')) if (isFloorOrWall && entity.data && entity.data.colorIndex > 37) { - this.el.querySelector('.entity_color').innerText = ClientHelper.toHex(entity.data.colorIndex - 38) + this.el.querySelector(".debug_container").style.display = 'block' + this.el.querySelector('.entity_color').innerText = "color: " + ClientHelper.toHex(entity.data.colorIndex - 38) } } From 20614a0e77e4f9a4802d312f9b25e47c57917192 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Wed, 15 Jul 2026 13:43:48 -0500 Subject: [PATCH 31/37] fix building not going invis in FOV mode check if function exists before calling --- packages/junon-io/client/src/entities/effects/invisible.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/junon-io/client/src/entities/effects/invisible.js b/packages/junon-io/client/src/entities/effects/invisible.js index 2670b46a..1f2a4a94 100644 --- a/packages/junon-io/client/src/entities/effects/invisible.js +++ b/packages/junon-io/client/src/entities/effects/invisible.js @@ -16,11 +16,12 @@ class Invisible extends BaseEffect { let opacity = { opacity: 1 } let targetOpacity = 0 if (this.affectedEntity.isPlayer() && - this.affectedEntity.isMe()) { + (this.affectedEntity.isMe && this.affectedEntity.isMe())) { targetOpacity = 0.2 } - if(this.affectedEntity.sector.settings.isFovMode && !this.affectedEntity.isMe()) { + if(this.affectedEntity.sector.settings.isFovMode && + (this.affectedEntity.isMe && !this.affectedEntity.isMe())) { return new TWEEN.Tween(opacity) .to({ opacity: targetOpacity }, 0) .onUpdate(() => { From 6570809d66cb63909573d4e5c1cfc0a00f76f294 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:47:05 -0500 Subject: [PATCH 32/37] manual update --- packages/junon-io/server/commands/menu.js | 36 ++--------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/packages/junon-io/server/commands/menu.js b/packages/junon-io/server/commands/menu.js index 312c4f0c..33439756 100644 --- a/packages/junon-io/server/commands/menu.js +++ b/packages/junon-io/server/commands/menu.js @@ -1,6 +1,4 @@ const BaseCommand = require("./base_command") -const Constants = require("../../common/constants") -const Protocol = require('../../common/util/protocol') class Menu extends BaseCommand { getUsage() { @@ -8,29 +6,10 @@ class Menu extends BaseCommand { "/menu close [menu name] [player name]", "/menu open [menu name] [player name]", "Available menu names:", - this.getAllowedMenus().join(", ") + "keypadMenu, craftMenu, atmMenu, friendsMenu, commandBlockMenu, teamMenu, welcomeMenu, stoveMenu, tradeMenu, slaveTradeMenu, badgeMenu" ] } - getAllowedMenus() - { - return ["blueprintMenu", - "inventoryMenu", - "chatMenu", - "tradeMenu", - "slaveTradeMenu", - "welcomeMenu", - "mapMenu", - "miniMapMenu", - "atmMenu", - "sidebarMenu", - "commandBlockMenu", - "voteMenu", - "friendsMenu", - "badgeMenu", - "teamMenu"] - } - allowOwnerOnly() { return true } @@ -41,6 +20,7 @@ class Menu extends BaseCommand { let player = args[2] let multiplePlayers // if(!caller || !caller.isPlayer()) return + // Commented cuz of didn't work in command block and useless if(player) { player = this.getPlayersBySelector(player) @@ -50,16 +30,6 @@ class Menu extends BaseCommand { } if(subcommand == "open") { - // only check allowed menus here - // since player shouldn't have entity-dependent menus open with this cmd - // but should be able to have them closed - let allowedMenus = this.getAllowedMenus() - if(allowedMenus.indexOf(menuName) === -1) - { - caller.showChatError("Menu invalid / unallowed: " + menuName) - return - } - if(multiplePlayers) { player.forEach((entity) => { this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) @@ -72,7 +42,7 @@ class Menu extends BaseCommand { if(subcommand == "close") { if(multiplePlayers) { player.forEach((entity) => { - this.getSocketUtil().emit(entity.socket, "CloseMenu", {menuName: menuName}) + this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) }) return } From 8ee8e4d918ed736c53d9ac7284d8bdab9dc40f11 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:51:01 -0500 Subject: [PATCH 33/37] revert changes --- packages/junon-io/server/commands/menu.js | 36 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/junon-io/server/commands/menu.js b/packages/junon-io/server/commands/menu.js index 33439756..312c4f0c 100644 --- a/packages/junon-io/server/commands/menu.js +++ b/packages/junon-io/server/commands/menu.js @@ -1,4 +1,6 @@ const BaseCommand = require("./base_command") +const Constants = require("../../common/constants") +const Protocol = require('../../common/util/protocol') class Menu extends BaseCommand { getUsage() { @@ -6,10 +8,29 @@ class Menu extends BaseCommand { "/menu close [menu name] [player name]", "/menu open [menu name] [player name]", "Available menu names:", - "keypadMenu, craftMenu, atmMenu, friendsMenu, commandBlockMenu, teamMenu, welcomeMenu, stoveMenu, tradeMenu, slaveTradeMenu, badgeMenu" + this.getAllowedMenus().join(", ") ] } + getAllowedMenus() + { + return ["blueprintMenu", + "inventoryMenu", + "chatMenu", + "tradeMenu", + "slaveTradeMenu", + "welcomeMenu", + "mapMenu", + "miniMapMenu", + "atmMenu", + "sidebarMenu", + "commandBlockMenu", + "voteMenu", + "friendsMenu", + "badgeMenu", + "teamMenu"] + } + allowOwnerOnly() { return true } @@ -20,7 +41,6 @@ class Menu extends BaseCommand { let player = args[2] let multiplePlayers // if(!caller || !caller.isPlayer()) return - // Commented cuz of didn't work in command block and useless if(player) { player = this.getPlayersBySelector(player) @@ -30,6 +50,16 @@ class Menu extends BaseCommand { } if(subcommand == "open") { + // only check allowed menus here + // since player shouldn't have entity-dependent menus open with this cmd + // but should be able to have them closed + let allowedMenus = this.getAllowedMenus() + if(allowedMenus.indexOf(menuName) === -1) + { + caller.showChatError("Menu invalid / unallowed: " + menuName) + return + } + if(multiplePlayers) { player.forEach((entity) => { this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) @@ -42,7 +72,7 @@ class Menu extends BaseCommand { if(subcommand == "close") { if(multiplePlayers) { player.forEach((entity) => { - this.getSocketUtil().emit(entity.socket, "OpenMenu", {menuName: menuName}) + this.getSocketUtil().emit(entity.socket, "CloseMenu", {menuName: menuName}) }) return } From 7314cb58de572f369a6a14364999bdd65ce1b560 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:19:32 -0500 Subject: [PATCH 34/37] fix meteor storm alert persisting alert would stay on map if you left before meteor storm happened and then joined another colony --- packages/junon-io/client/src/menus/map_menu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/junon-io/client/src/menus/map_menu.js b/packages/junon-io/client/src/menus/map_menu.js index d9f64ca0..8a7eea2b 100644 --- a/packages/junon-io/client/src/menus/map_menu.js +++ b/packages/junon-io/client/src/menus/map_menu.js @@ -57,6 +57,7 @@ class MapMenu extends BaseMenu { reinit() { // the grid size is 200x200. map is 600px by 600px wide let sectorColCount = this.game.sector.getColCount() + this.alerts = {} this.zoomMultiplier = Math.floor(this.mapSize / sectorColCount) } @@ -450,4 +451,4 @@ class MapMenu extends BaseMenu { -module.exports = MapMenu \ No newline at end of file +module.exports = MapMenu From c4f0dff83400358fda89714fa72b3f89d92290bb Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Thu, 23 Jul 2026 17:30:44 -0500 Subject: [PATCH 35/37] decrease size of small airlock sprites to fix break sprite being shrunken --- .../assets/images/small_airlock_lower.png | Bin 524 -> 309 bytes .../assets/images/small_airlock_upper.png | Bin 516 -> 301 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/junon-io/client/assets/images/small_airlock_lower.png b/packages/junon-io/client/assets/images/small_airlock_lower.png index b224db15f78170dd6269f7fb6ee8964f17dd8575..c187edcea52bb3f253ee9799f1f1a0cf718fb668 100644 GIT binary patch delta 280 zcmeBS*~(ERLtq!mDzgAGU)S5lQ%NCJwylwgA z-s10a*JuB(`pC)9%EYkNYe|rjuj&@7cT56b944mknB%`&WFEtjx~J2+_OP?m`$#k} bu3&Ui4AYcVUMm*^^d*C*tDnm{r-UW|Sh#5u literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9Fx?I6t9|MX)jP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_s8No-U3d6?5LscJw>sAmO%u z+vRC2E*#cQmv#gc9A@tt8%#MW4ABj}ED78jCNktOnh7=N9&lsYzvFmH+WeLH#GZIEyVvr4nw6t2E&Q-gqZEDkce$d+-$@YrI-s=Itl_uU`- zeo<;IasR#|*ZWqj6&DgNKKf-aoxs8tVFrPyK?&QG*E8^L7k@ XU!8(0{L_1ZG0EWR>gTe~DWM4f$^qER diff --git a/packages/junon-io/client/assets/images/small_airlock_upper.png b/packages/junon-io/client/assets/images/small_airlock_upper.png index 7d9f6d96b69f7317e53fbab932ffbc4beea312e9..17c1fc1d771260b15889ad75c9d37bd42815aedb 100644 GIT binary patch delta 272 zcmZo+S<7VB8Q|y6%O%Cdz`(%k>ERLtq!mDzgAGU)S5%=nom)~m4h2EEM0B>;lRBE*(MXx^xsOb8!w$O z$yNCu?+-WmN5?<^Rr-9dIY|A|Wo`$?AM6dqFW8obT-s?H$JD*$+HO9xV{e!_F24Tj zXy3!YplP+m_wUzDF+k3YIftLf$ek~IIs(-9s7z2ySll$eExx_K-|l+p z%B-XNFZ4ypgmMK7#%$f&QT?@wCxtZ_SR0o9nkHYyHAz)K`x6V71ET`_3`Ut*n$hJC SZ)E~~$KdJe=d#Wzp$P!-o@l@T literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9Fx?I6t9|MX)jP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_s87o-U3d6?5LsI-A$zAmV19 zz#^=Bb%(OblJ2nG4_PaiGR*?Hp_l%XMS{4W}S7$o%A!|37dVh<^Q<^PO0#V-}1YMvq0*%+PzJ4%g)YV zxStp~4MhK|SQ5MY+xjip$5=WJF?d~mw#C%?2UV! ze^~0pFY_b!{2Nfc%d~;@h6e*MOkQ95r>l3KNfsO~dhcW|m_iM}5m3*V*KTo|xGMh> RKQIOvJYD@<);T3K0RSQB)PDc~ From 23896b33ad1462c8adf1931a46ddd18422b31884 Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 24 Jul 2026 10:37:23 -0500 Subject: [PATCH 36/37] enable fill building again with the lag throttle in place, it shouldn't be too abusable --- packages/junon-io/server/commands/fill.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/junon-io/server/commands/fill.js b/packages/junon-io/server/commands/fill.js index f2ddfd02..21f00da3 100644 --- a/packages/junon-io/server/commands/fill.js +++ b/packages/junon-io/server/commands/fill.js @@ -9,7 +9,7 @@ class Fill extends BaseCommand { getUsage() { return [ "/fill [start_row] [start_col] [end_row] [end_col] [terrain_type] [color]", - // "/fill building [start_row] [start_col] [end_row] [end_col] [1x1 building] [color]" + "/fill building [start_row] [start_col] [end_row] [end_col] [1x1 building] [color]" ] } @@ -19,7 +19,7 @@ class Fill extends BaseCommand { perform(player, args) { - if(false) { + if(args[0] == 'building') { let startRow = parseInt(args[1]) let startCol = parseInt(args[2]) let endRow = parseInt(args[3]) From 896ba83d59cc9074994b5109310e891d54971a1f Mon Sep 17 00:00:00 2001 From: wahlee <120862914+Wahlee1@users.noreply.github.com> Date: Fri, 24 Jul 2026 17:37:14 -0500 Subject: [PATCH 37/37] fix lamp color getting reset upon being damaged --- packages/junon-io/client/src/entities/buildings/lamp.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/junon-io/client/src/entities/buildings/lamp.js b/packages/junon-io/client/src/entities/buildings/lamp.js index b1454c17..3bdaaff2 100644 --- a/packages/junon-io/client/src/entities/buildings/lamp.js +++ b/packages/junon-io/client/src/entities/buildings/lamp.js @@ -226,6 +226,10 @@ class Lamp extends BaseBuilding { } } + getDefaultSpriteColor() { + return ClientHelper.hexToInt(this.getLightColor()) + } + getType() { return Protocol.definition().BuildingType.Lamp }