/* * IDK Game Server by Steve Winfield * https://github.com/WinfieldSteve */ package org.stevewinfield.suja.idk.game.rooms.wired; import org.stevewinfield.suja.idk.communication.MessageReader; import org.stevewinfield.suja.idk.game.rooms.RoomInstance; import org.stevewinfield.suja.idk.game.rooms.RoomItem; import org.stevewinfield.suja.idk.game.rooms.RoomPlayer; import org.stevewinfield.suja.idk.game.rooms.coordination.Vector2; import org.stevewinfield.suja.idk.game.rooms.wired.triggers.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class WiredHandler { public ConcurrentHashMap<Vector2, ConcurrentHashMap<Integer, IWiredItem>> getStack() { return stack; } public WiredHandler(final RoomInstance room) { this.stack = new ConcurrentHashMap<>(); } public void addItem(final Vector2 position, final IWiredItem item) { if (!this.stack.containsKey(position)) { this.stack.put(position, new ConcurrentHashMap<Integer, IWiredItem>()); } this.stack.get(position).put(item.getItem().getItemId(), item); } public void itemTriggered(final WiredTrigger trigger, final RoomPlayer player, final Vector2 pos) { for (final IWiredItem item : this.stack.get(pos).values()) { if (item instanceof WiredAction) { final WiredAction action = (WiredAction) item; this.lightItem(action); if (player == null) { for (final RoomPlayer sPlayer : trigger.getItem().getRoom().getRoomPlayers().values()) { action.onHandle(sPlayer); } } else { action.onHandle(player); } } } } public void onFloorItemRemoved(final RoomItem item) { final RoomInstance room = item.getRoom(); for (final RoomItem checkWired : room.getRoomItems().values()) { if (WiredManager.isWiredItem(checkWired.getBase()) && this.getStack().containsKey(checkWired.getPosition().getVector2()) && this.getStack().get(checkWired.getPosition().getVector2()).get(checkWired.getItemId()) != null) { final IWiredItem wiredItem = this.getStack().get(checkWired.getPosition().getVector2()).get(checkWired.getItemId()); if (wiredItem != null && wiredItem.getItems() != null && wiredItem.getItems().contains(item.getItemId())) { String furniString = ""; for (final int furni : wiredItem.getItems()) { if (furni == item.getItemId()) { continue; } furniString += "," + furni; } final String[] obj = wiredItem.getDelay() > -1 ? new String[]{furniString.length() > 0 ? furniString.substring(1) : furniString, wiredItem.getDelay() + ""} : new String[]{furniString.length() > 0 ? furniString.substring(1) : furniString}; wiredItem.set(obj); checkWired.setTermFlags(obj); } } } } public void lightItem(final IWiredItem item) { item.getItem().setFlags(1); item.getItem().update(false); item.getItem().requestCycles(1); } public boolean onPlayerSays(final RoomPlayer player, final String message) { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerUserSays && ((WiredTrigger) item).onTrigger(player, message)) { if (!x) { player.whisper(player.getSession(), player.getVirtualId(), message); } this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, player, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onPlayerEnters(final RoomPlayer player) { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerEnterRoom && ((WiredTrigger) item).onTrigger(player, null)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, player, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onPlayerWalksOnFurni(final RoomPlayer player, final RoomItem obj) { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerUserWalksOnFurni && ((WiredTrigger) item).onTrigger(player, obj)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, player, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onPlayerChangedState(final RoomPlayer player, final RoomItem obj) { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerStateChanged && ((WiredTrigger) item).onTrigger(player, obj)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, player, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onPlayerWalksOffFurni(final RoomPlayer player, final RoomItem obj) { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerUserWalksOffFurni && ((WiredTrigger) item).onTrigger(player, obj)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, player, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onTriggerPeriodically() { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerPeriodically && ((WiredTrigger) item).onTrigger(null, null)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, null, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onGameEnds() { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerGameEnds && ((WiredTrigger) item).onTrigger(null, null)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, null, e.getKey()); } x = true; x2 = true; } } } return x; } public boolean onGameStarts() { boolean x = false; for (final Map.Entry<Vector2, ConcurrentHashMap<Integer, IWiredItem>> e : stack.entrySet()) { boolean x2 = false; for (final IWiredItem item : e.getValue().values()) { if (item.getWiredType() == 1 && item instanceof WiredTriggerGameStarts && ((WiredTrigger) item).onTrigger(null, null)) { this.lightItem(item); if (!x2) { this.itemTriggered((WiredTrigger) item, null, e.getKey()); } x = true; x2 = true; } } } return x; } public void saveWired(final RoomItem item, final MessageReader reader) { if (!this.stack.get(item.getPosition().getVector2()).containsKey(item.getItemId())) { return; } final IWiredItem wired = this.stack.get(item.getPosition().getVector2()).get(item.getItemId()); final String[] obj = wired.getObject(reader); if (obj != null) { wired.set(obj); item.setTermFlags(obj); } item.update(true, false); } public void moveWired(final RoomItem item, final Vector2 oldCoords) { this.addItem(item.getPosition().getVector2(), this.stack.get(oldCoords).remove(item.getItemId())); } public void removeItem(final RoomItem item, final Vector2 coords) { this.stack.get(coords).remove(item.getItemId()); } private final ConcurrentHashMap<Vector2, ConcurrentHashMap<Integer, IWiredItem>> stack; }