diff --git a/ngengine_public.jar b/ngengine_public.jar index 46247ad2..1ef9aa2a 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/scripts/object/tangible/terminal/terminal_bank.py b/scripts/object/tangible/terminal/terminal_bank.py index ccad8904..4f4e89ae 100644 --- a/scripts/object/tangible/terminal/terminal_bank.py +++ b/scripts/object/tangible/terminal/terminal_bank.py @@ -1,4 +1,6 @@ import sys def setup(core, object): - return \ No newline at end of file + object.setAttachment('radial_filename', 'bank') + return + \ No newline at end of file diff --git a/scripts/radial/bank.py b/scripts/radial/bank.py new file mode 100644 index 00000000..4fe4097e --- /dev/null +++ b/scripts/radial/bank.py @@ -0,0 +1,27 @@ +from resources.common import RadialOptions +import sys + +def createRadial(core, owner, target, radials): + radials.clear() + bank = owner.getSlottedObject('bank') + if bank: + radials.add(RadialOptions(0, 21, 1, '')) + radials.add(RadialOptions(0, 7, 1, '')) + radials.add(RadialOptions(1, RadialOptions.bankTransfer, 3, '@sui:bank_credits')) + radials.add(RadialOptions(1, RadialOptions.bankitems, 3, '@sui:bank_items')) + if owner.getBankCredits() > 0: + radials.add(RadialOptions(1, RadialOptions.bankWithdrawAll, 3, '@sui:bank_withdrawall')) + if owner.getCashCredits() > 0: + radials.add(RadialOptions(1, RadialOptions.bankDepositAll, 3, '@sui:bank_depositall')) + + return + +def handleSelection(core, owner, target, option): + + if option == RadialOptions.bankitems: + bank = owner.getSlottedObject('bank') + if bank: + core.simulationService.openContainer(owner, bank) + + return + \ No newline at end of file diff --git a/scripts/radial/default.py b/scripts/radial/default.py new file mode 100644 index 00000000..572f253b --- /dev/null +++ b/scripts/radial/default.py @@ -0,0 +1,9 @@ +from resources.common import RadialOptions +import sys + +def createRadial(core, owner, target, radials): + return + +def handleSelection(core, owner, target, option): + return + \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 5f017c86..019aacfa 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -28,7 +28,7 @@ import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; - +import resources.common.RadialOptions; import resources.objects.creature.CreatureObject; import services.AttributeService; import services.CharacterService; @@ -42,6 +42,7 @@ import services.chat.ChatService; import services.command.CommandService; import services.object.ObjectService; import services.object.UpdateService; +import services.sui.SUIService; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.CrcStringTableVisitor; import engine.clientdata.visitors.DatatableVisitor; @@ -93,6 +94,7 @@ public class NGECore { public ScriptService scriptService; public ChatService chatService; public AttributeService attributeService; + public SUIService suiService; // Login Server @@ -141,7 +143,7 @@ public class NGECore { commandService = new CommandService(this); chatService = new ChatService(this); attributeService = new AttributeService(this); - + suiService = new SUIService(this); // Ping Server try { PingServer pingServer = new PingServer(config.getInt("PING.PORT")); @@ -162,6 +164,7 @@ public class NGECore { zoneDispatch.addService(objectService); zoneDispatch.addService(commandService); zoneDispatch.addService(chatService); + zoneDispatch.addService(suiService); zoneServer = new MINAServer(zoneDispatch, config.getInt("ZONE.PORT")); zoneServer.start(); diff --git a/src/protocol/swg/ObjControllerMessage.java b/src/protocol/swg/ObjControllerMessage.java index 68d1f813..7792009c 100644 --- a/src/protocol/swg/ObjControllerMessage.java +++ b/src/protocol/swg/ObjControllerMessage.java @@ -48,6 +48,7 @@ public class ObjControllerMessage extends SWGMessage { public static final int COMBAT_SPAM = 0x0134; public static final int POSTURE = 0x0131; public static final int SIT_ON_OBJECT = 0x013B; + public static final int OBJECT_MENU_RESPONSE = 0x0147; public ObjControllerMessage() { diff --git a/src/protocol/swg/ObjectMenuSelect.java b/src/protocol/swg/ObjectMenuSelect.java new file mode 100644 index 00000000..f3bd2f50 --- /dev/null +++ b/src/protocol/swg/ObjectMenuSelect.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package protocol.swg; + +import org.apache.mina.core.buffer.IoBuffer; + +public class ObjectMenuSelect extends SWGMessage { + + private byte selection; + private long objectId; + + @Override + public void deserialize(IoBuffer buffer) { + + buffer.getShort(); + buffer.getInt(); + setObjectId(buffer.getLong()); + setSelection(buffer.get()); + + } + + @Override + public IoBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + public byte getSelection() { + return selection; + } + + public void setSelection(byte selection) { + this.selection = selection; + } + + public long getObjectId() { + return objectId; + } + + public void setObjectId(long objectId) { + this.objectId = objectId; + } + +} diff --git a/src/protocol/swg/objectControllerObjects/DataTransform.java b/src/protocol/swg/objectControllerObjects/DataTransform.java index 522f540a..a86fccc0 100644 --- a/src/protocol/swg/objectControllerObjects/DataTransform.java +++ b/src/protocol/swg/objectControllerObjects/DataTransform.java @@ -32,7 +32,7 @@ import engine.resources.scene.Quaternion; import protocol.swg.ObjControllerMessage; -public class DataTransform extends ObjControllerObject{ +public class DataTransform extends ObjControllerObject { private long objectId; private int movementIndex; diff --git a/src/protocol/swg/objectControllerObjects/ObjectMenuRequest.java b/src/protocol/swg/objectControllerObjects/ObjectMenuRequest.java new file mode 100644 index 00000000..24396109 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/ObjectMenuRequest.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package protocol.swg.objectControllerObjects; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.Vector; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.common.Utilities; + +import resources.common.RadialOptions; + +public class ObjectMenuRequest extends ObjControllerObject { + + private long characterId; + private long targetId; + private Vector radialOptions = new Vector(); + private byte radialCount; + + @Override + public void deserialize(IoBuffer buffer) { + + setCharacterId(buffer.getLong()); + buffer.getInt(); + setTargetId(buffer.getLong()); + setCharacterId(buffer.getLong()); + + int listSize = buffer.getInt(); + for(int i = 0; i < listSize; i++) { + RadialOptions radial = new RadialOptions(); + if(buffer.get() == 0) // option # + return; + radial.setParentId(buffer.get()); + radial.setOptionId(buffer.get()); + buffer.get(); + radial.setOptionType(buffer.get()); + int size = buffer.getInt(); + if(size > 0) { + try { + radial.setDescription(new String(ByteBuffer.allocate(size * 2).put(buffer.array(), buffer.position(), size * 2).array(), "UTF-16LE")); + buffer.position(buffer.position() + size * 2); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } else { + radial.setDescription(""); + } + radialOptions.add(radial); + } + setRadialCount(buffer.get()); + } + + @Override + public IoBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + public Vector getRadialOptions() { + return radialOptions; + } + + public long getTargetId() { + return targetId; + } + + public void setTargetId(long targetId) { + this.targetId = targetId; + } + + public long getCharacterId() { + return characterId; + } + + public void setCharacterId(long characterId) { + this.characterId = characterId; + } + + public byte getRadialCount() { + return radialCount; + } + + public void setRadialCount(byte radialCount) { + this.radialCount = radialCount; + } + +} diff --git a/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java b/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java new file mode 100644 index 00000000..e4847406 --- /dev/null +++ b/src/protocol/swg/objectControllerObjects/ObjectMenuResponse.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package protocol.swg.objectControllerObjects; + +import java.nio.ByteOrder; +import java.util.Vector; + +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.common.Utilities; + +import protocol.swg.ObjControllerMessage; + +import resources.common.RadialOptions; + +public class ObjectMenuResponse extends ObjControllerObject { + + private long ownerId; + private long targetId; + private Vector radialOptions; + private byte radialCount; + + public ObjectMenuResponse() { + + } + + public ObjectMenuResponse(long ownerId, long targetId, Vector radialOptions, byte radialCount) { + + this.ownerId = ownerId; + this.targetId = targetId; + this.radialOptions = radialOptions; + this.radialCount = radialCount; + + } + + + @Override + public void deserialize(IoBuffer data) { + // TODO Auto-generated method stub + + } + + @Override + public IoBuffer serialize() { + + IoBuffer result = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN); + result.setAutoExpand(true); + + result.putInt(ObjControllerMessage.OBJECT_MENU_RESPONSE); + result.putLong(ownerId); + result.putInt(0); + result.putLong(targetId); + result.putLong(ownerId); + + int size = radialOptions.size(); + result.putInt(size); + + if(size > 0) { + byte counter = 1; + for(RadialOptions radialOption : radialOptions) { + result.put(counter++); + result.put(radialOption.getParentId()); + result.put(radialOption.getOptionId()); + result.put((byte) 0); + result.put(radialOption.getOptionType()); + + if(radialOption.getDescription().length() > 0) + result.put(getUnicodeString(radialOption.getDescription())); + else + result.putInt(0); + + } + } + + result.put(radialCount); + + int packetSize = result.position(); + result = IoBuffer.allocate(packetSize).put(result.array(), 0, packetSize); + return result.flip(); + + } + +} diff --git a/src/services/SUIService.java b/src/resources/common/FileUtilities.java similarity index 72% rename from src/services/SUIService.java rename to src/resources/common/FileUtilities.java index feed4983..86904bc7 100644 --- a/src/services/SUIService.java +++ b/src/resources/common/FileUtilities.java @@ -19,8 +19,24 @@ * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. ******************************************************************************/ -package services; +package resources.common; -public class SUIService { +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; + +public class FileUtilities { + + public static int getNumberOfLines(String fileName) throws IOException { + + LineNumberReader lnr; + lnr = new LineNumberReader(new FileReader(fileName)); + lnr.skip(Long.MAX_VALUE); + int numberOfLines = lnr.getLineNumber() + 1; + lnr.close(); + return numberOfLines; + + + } } diff --git a/src/resources/common/ObjControllerOpcodes.java b/src/resources/common/ObjControllerOpcodes.java index 6bdb4d08..00d21831 100644 --- a/src/resources/common/ObjControllerOpcodes.java +++ b/src/resources/common/ObjControllerOpcodes.java @@ -27,5 +27,6 @@ public class ObjControllerOpcodes { public static final int DATA_TRANSFORM_WITH_PARENT = 0xF1000000; public static final int COMMAND_QUEUE_ENQUEUE = 0x16010000; public static final int TARGET_UPDATE = 0x26010000; + public static final int OBJECT_MENU_REQUEST = 0x46010000; } diff --git a/src/resources/common/Opcodes.java b/src/resources/common/Opcodes.java index 6fbaa9f9..cbe41e47 100644 --- a/src/resources/common/Opcodes.java +++ b/src/resources/common/Opcodes.java @@ -39,6 +39,7 @@ public class Opcodes { public static int LagRequest = 0x31805EE0; public static int LoginClientId = 0x41131F96; public static int ObjControllerMessage = 0x80CE5E46; + public static int ObjectSelectMenuMessage = 0x7CA18726; public static int RequestGalaxyLoopTimes = 0x7D842D68; public static int SelectCharacter = 0xB5098D76; diff --git a/src/resources/common/RadialOptions.java b/src/resources/common/RadialOptions.java new file mode 100644 index 00000000..1e64c0d4 --- /dev/null +++ b/src/resources/common/RadialOptions.java @@ -0,0 +1,328 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package resources.common; + +public class RadialOptions { + + public static int unknown = 0; + public static int combatTarget = 1; + public static int combatUntarget = 2; + public static int combatAttack = 3; + public static int combatPeace = 4; + public static int combatDuel = 5; + public static int combatDeathBlow = 6; + public static int examine = 7; + public static int tradeStart = 8; + public static int tradeAccept = 9; + public static int itemPickup = 10; + public static int itemEquip = 11; + public static int itemUnequip = 12; + public static int itemDrop = 13; + public static int itemDestroy = 14; + public static int itemToken = 15; + public static int itemOpen = 16; + public static int itemOpenNewWindow = 17; + public static int itemActivate = 18; + public static int itemDeactivate = 19; + public static int itemUse = 20; + public static int itemUseSelf = 21; + public static int itemUseOther = 22; + public static int itemSit = 23; + public static int itemMail = 24; + public static int converseStart = 25; + public static int converseRespond = 26; + public static int converseResponse = 27; + public static int converseStop = 28; + public static int craftOptions = 29; + public static int craftStart = 30; + public static int craftHopperInput = 31; + public static int craftHopperOutput = 32; + public static int missionTerminalList = 33; + public static int missionDetails = 34; + public static int loot = 35; + public static int lootAll = 36; + public static int groupInvite = 37; + public static int groupJoin = 38; + public static int groupLeave = 39; + public static int groupKick = 40; + public static int groupDisband = 41; + public static int groupDecline = 42; + public static int extractObject = 43; + public static int petCall = 44; + public static int terminalAuctionUse = 45; + public static int creatureFollow = 46; + public static int creatureStopFollow = 47; + public static int split = 48; + public static int imagedesign = 49; + public static int setName = 50; + public static int itemRotate = 51; + public static int itemRotateRight = 52; + public static int itemRotateLeft = 53; + public static int itemMove = 54; + public static int itemMoveForward = 55; + public static int itemMoveBack = 56; + public static int itemMoveUp = 57; + public static int itemMoveDown = 58; + public static int petStore = 59; + public static int vehicleGenerate = 60; + public static int vehicleStore = 61; + public static int missionAbort = 62; + public static int missionEndDuty = 63; + public static int shipManageComponents = 64; + public static int waypointAutopilot = 65; + public static int programDroid = 66; + public static int serverDivider = 67; + public static int serverMenu1 = 68; + public static int serverMenu2 = 69; + public static int serverMenu3 = 70; + public static int serverMenu4 = 71; + public static int serverMenu5 = 72; + public static int serverMenu6 = 73; + public static int serverMenu7 = 74; + public static int serverMenu8 = 75; + public static int serverMenu9 = 76; + public static int serverMenu10 = 77; + public static int serverHarvesterManage = 78; + public static int serverHouseManage = 79; + public static int serverFactionHallManage = 80; + public static int serverHue = 81; + public static int serverObserve = 82; + public static int serverStopObserving = 83; + public static int serverTravelOptions = 84; + public static int serverBazaarOptions = 85; + public static int serverShippingOptions = 86; + public static int serverHealWound = 87; + public static int serverHealWoundHealth = 88; + public static int serverHealWoundAction = 89; + public static int serverHealWoundStrength = 90; + public static int serverHealWoundConst = 91; + public static int serverHealWoundQuickness = 92; + public static int serverHealWoundStamina = 93; + public static int serverHealDamage = 94; + public static int serverHealState = 95; + public static int serverHealStateStunned = 96; + public static int serverHealStateBlinded = 97; + public static int serverHealStateDizzy = 98; + public static int serverHealStateintim = 99; + public static int serverHealEnhance = 100; + public static int serverHealEnhanceHealth = 101; + public static int serverHealEnhanceAction = 102; + public static int serverHealEnhanceStrangth = 103; + public static int serverHealEnhanceConst = 104; + public static int serverHealEnhanceQuickness = 105; + public static int serverHealEnhanceStamina = 106; + public static int serverHealFirstAid = 107; + public static int serverHealCurePoison = 108; + public static int serverHealCureDisease = 109; + public static int serverHealApplyPoison = 110; + public static int serverHealApplyDisease = 111; + public static int serverHarvestCorpse = 112; + public static int serverPerformanceListen = 113; + public static int serverPerformanceWatch = 114; + public static int serverPerformanceListenStop = 115; + public static int serverPerformanceWatchStop = 116; + public static int serverTerminalPermissions = 117; + public static int serverTerminalManagement = 118; + public static int serverTerminalPermissionsEnter = 119; + public static int serverTerminalPermissionsBanned = 120; + public static int serverTerminalPermissionsAdmin = 121; + public static int serverTerminalPermissionVendor = 122; + public static int serverTerminalPermissionsHopper = 123; + public static int serverTerminalManagementStatus = 124; + public static int serverTerminalManagementPrivacy = 125; + public static int serverTerminalManagementTransfer = 126; + public static int serverTerminalManagementResidence = 127; + public static int serverTerminalManagementDestroy = 128; + public static int serverTerminalManagementPay = 129; + public static int serverTerminalCreateVendor = 130; + public static int serverGiveVendorMaintenance = 131; + public static int serveritemOptions = 132; + public static int serverSurveyToolRange = 133; + public static int serverSurveyToolResolution = 134; + public static int serverSurveyToolClass = 135; + public static int serverProbeDroidTrackTarget = 136; + public static int serverProbeDroidFindTarget = 137; + public static int serverProbeDroidActivate = 138; + public static int serverProbeDroidBuy = 139; + public static int serverTeach = 140; + public static int petCommand = 141; + public static int petFollow = 142; + public static int petStay = 143; + public static int petGuard = 144; + public static int petFriend = 145; + public static int petAttack = 146; + public static int petPatrol = 147; + public static int petGetPatrolPoint = 148; + public static int petClearPatrolPoint = 149; + public static int petAssumeFormation1 = 150; + public static int petAssumeFormation2 = 151; + public static int petTransfer = 152; + public static int petRelease = 153; + public static int petTrick1 = 154; + public static int petTrick2 = 155; + public static int petTrick3 = 156; + public static int petTrick4 = 157; + public static int petGroup = 158; + public static int petTame = 159; + public static int petFeed = 160; + public static int petSpecialAttackOne = 161; + public static int petSpecialAttackTwo = 162; + public static int petRangedAttack = 163; + public static int diceRoll = 164; //Reused for HarvestMeat + public static int diceTwoFace = 165; //Reused for HarvestHide + public static int diceThreeFace = 166; //Reused for HarvestBone + public static int diceFourFace = 167; //Reused for Milk Me + public static int diceFiveFace = 168; + public static int diceSixFace = 169; + public static int diceSevenFace = 170; + public static int diceEightFace = 171; + public static int diceCountOne = 172; + public static int diceCountTwo = 173; + public static int diceCountThree = 174; + public static int diceCountFour = 175; + public static int createBallot = 176; + public static int vote = 177; + public static int bombingRun = 178; + public static int selfDestruct = 179; + public static int thirtySec = 180; + public static int fifteenSec = 181; + public static int serverCampDisband = 182; + public static int serverCampAssumeOwnership = 183; + public static int serverProbeDroidProram = 184; + public static int serverGuildCreate = 185; + public static int serverGuildInfo = 186; + public static int serverGuildMembers = 187; + public static int serverGuildSponsored = 188; + public static int serverGuildEnemies = 189; + public static int serverGuildSponsor = 190; + public static int serverGuildDisband = 191; + public static int serverGuildNameChange = 192; + public static int serverGuildGuildManagement = 193; + public static int serverGuildMemberManagement = 194; + public static int serverManfHopperInput = 195; + public static int serverManfHopperOutput = 196; + public static int serverManfStationSchematic = 197; + public static int elevatorUp = 198; + public static int elevatorDown = 199; + public static int serverPetOpen = 200; + public static int serverPetDpad = 201; + public static int serverMedToolDiagnose = 202; + public static int serverMedToolTendWound = 203; + public static int serverMedToolTendDamage = 204; + public static int serverPetMount = 205; + public static int serverPetDismount = 206; + public static int serverPetTrainMount = 207; + public static int serverVehicleEnter = 208; + public static int serverVehicleExit = 209; + public static int openNaviCompDpad = 210; + public static int initNavicompDpad = 211; + public static int cityStatus = 212; + public static int cityCitizens = 213; + public static int cityStructures = 214; + public static int cityTreasury = 215; + public static int cityManagement = 216; + public static int cityName = 217; + public static int cityMilitia = 218; + public static int cityTaxes = 219; + public static int cityTreasuryDeposit = 220; + public static int cityTreasuryWithdraw = 221; + public static int cityRegister = 222; + public static int cityRank = 223; + public static int cityAdmin1 = 224; + public static int cityAdmin2 = 225; + public static int cityAdmin3 = 226; + public static int cityAdmin4 = 227; + public static int cityAdmin5 = 228; + public static int cityAdmin6 = 229; + public static int memoryChipProgram = 230; + public static int memoryChipTransfer = 231; + public static int memoryChipAnalyze = 232; + public static int equipDroidOnChip = 233; + public static int bankJoin = 234; + public static int bankQuit = 235; + public static int bankDepositAll = 114; + public static int bankWithdrawAll = 115; + public static int bankTransfer = 112; + public static int bankitems = 113; + public static int fireworkshowAdd = 240; + public static int fireworkshowRemove = 241; + public static int fireworkshowModify = 242; + public static int fireworkshowReorder = 243; + public static int fireworkshowData = 244; + public static int operateHarvester = 245; + public static int payMaintenance = 246; + public static int depositPower = 247; + public static int StructureStatus = 248; + public static int StructureOptions = 249; + public static int StartManufacture = 250; + public static int ListIngredients = 251; + public static int StopManufacture = 252; + + private byte parentId; + private byte optionId; + private byte optionType; + private String description; + + public RadialOptions(byte parentId, byte optionId, byte optionType, String description) { + this.setParentId(parentId); + this.setOptionId(optionId); + this.setOptionType(optionType); + this.setDescription(description); + } + + public RadialOptions() { + // TODO Auto-generated constructor stub + } + + public byte getParentId() { + return parentId; + } + + public void setParentId(byte parentId) { + this.parentId = parentId; + } + + public byte getOptionId() { + return optionId; + } + + public void setOptionId(byte optionId) { + this.optionId = optionId; + } + + public byte getOptionType() { + return optionType; + } + + public void setOptionType(byte optionType) { + this.optionType = optionType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/src/resources/objects/guild/GuildObject.java b/src/resources/objects/guild/GuildObject.java index dc8081b9..275589a3 100644 --- a/src/resources/objects/guild/GuildObject.java +++ b/src/resources/objects/guild/GuildObject.java @@ -24,14 +24,16 @@ package resources.objects.guild; import java.util.ArrayList; import java.util.List; -import com.sleepycat.persist.model.NotPersistent; - -import clients.Client; import resources.objects.CurrentServerGCWZoneInfo; import resources.objects.CurrentServerGCWZonePercent; import resources.objects.Guild; import resources.objects.OtherServerGCWZonePercent; -import resources.objects.SWGObject; + +import com.sleepycat.persist.model.NotPersistent; + +import engine.clients.Client; +import engine.resources.objects.SWGObject; + public class GuildObject extends SWGObject { @@ -309,5 +311,6 @@ public class GuildObject extends SWGObject { destination.getSession().write(messageBuilder.buildBaseline3()); destination.getSession().write(messageBuilder.buildBaseline6()); } + } diff --git a/src/services/ScriptService.java b/src/services/ScriptService.java index a70fd9ee..e1ff664b 100644 --- a/src/services/ScriptService.java +++ b/src/services/ScriptService.java @@ -77,6 +77,14 @@ public class ScriptService { func.__call__(Py.java2py(arg1), Py.java2py(arg2), Py.java2py(arg3), Py.java2py(arg4)); interpreter.cleanup(); } + + public PyObject getMethod(String path, String module, String method) { + PythonInterpreter interpreter = new PythonInterpreter(); + interpreter.exec("import sys\nsys.path.append('" + path + "')\nfrom " + module + " import " + method); + PyObject func = interpreter.get(method); + interpreter.cleanup(); + return func; + } } diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 4cd29e26..e14c7255 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -22,6 +22,10 @@ package services.object; import java.io.Console; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; import java.nio.ByteOrder; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -32,6 +36,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; @@ -40,6 +45,8 @@ import resources.common.*; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; +import org.python.core.Py; +import org.python.core.PyObject; import com.sleepycat.persist.EntityCursor; @@ -89,6 +96,8 @@ public class ObjectService implements INetworkDispatch { private Random random = new Random(); + private Map serverTemplates = new ConcurrentHashMap(); + public ObjectService(final NGECore core) { this.core = core; databaseConnection = core.getDatabase1(); @@ -157,7 +166,28 @@ public class ObjectService implements INetworkDispatch { return null; } + + String serverTemplate = Template.replace(".iff", ""); + // check if template is empty(4 default lines) to reduce RAM usage(saves about 500 MB of RAM) + try { + int numberOfLines = FileUtilities.getNumberOfLines("scripts/" + serverTemplate.split("shared_" , 2)[0].replace("shared_", "") + serverTemplate.split("shared_" , 2)[1] + ".py"); + + if(numberOfLines > 4) { + if(serverTemplates.containsKey(Template)) { + PyObject func = serverTemplates.get(Template); + func.__call__(Py.java2py(core), Py.java2py(object)); + } else { + PyObject func = core.scriptService.getMethod("scripts/" + serverTemplate.split("shared_" , 2)[0].replace("shared_", ""), serverTemplate.split("shared_" , 2)[1], "setup"); + func.__call__(Py.java2py(core), Py.java2py(object)); + serverTemplates.put(Template, func); + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + //core.scriptService.callScript("scripts/" + serverTemplate.split("shared_" , 2)[0].replace("shared_", ""), "setup", serverTemplate.split("shared_" , 2)[1], core, object); object.setPlanetId(planet.getID()); objectList.add(object); @@ -322,6 +352,7 @@ public class ObjectService implements INetworkDispatch { creature = (CreatureObject) getObject(objectId); } + creature.setClient(client); Point3D position = creature.getPosition(); Planet planet = core.terrainService.getPlanetByID(creature.getPlanetId()); diff --git a/src/services/sui/SUIService.java b/src/services/sui/SUIService.java index a235d30b..d0a8af16 100644 --- a/src/services/sui/SUIService.java +++ b/src/services/sui/SUIService.java @@ -21,6 +21,120 @@ ******************************************************************************/ package services.sui; -public class SUIService { +import java.nio.ByteOrder; +import java.util.Map; +import java.util.Vector; + +import main.NGECore; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +import protocol.swg.ObjControllerMessage; +import protocol.swg.ObjectMenuSelect; +import protocol.swg.objectControllerObjects.ObjectMenuRequest; +import protocol.swg.objectControllerObjects.ObjectMenuResponse; + +import resources.common.ObjControllerOpcodes; +import resources.common.Opcodes; +import resources.common.RadialOptions; + +import engine.clients.Client; +import engine.resources.objects.SWGObject; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; + +public class SUIService implements INetworkDispatch { + + private NGECore core; + + public SUIService(NGECore core) { + this.core = core; + } + + @Override + public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + + objControllerOpcodes.put(ObjControllerOpcodes.OBJECT_MENU_REQUEST, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + + ObjectMenuRequest request = new ObjectMenuRequest(); + request.deserialize(data); + + SWGObject target = core.objectService.getObject(request.getTargetId()); + SWGObject owner = core.objectService.getObject(request.getCharacterId()); + + if(target == null || owner == null) + return; + + + core.scriptService.callScript("scripts/radial/", getRadialFilename(target), "createRadial", core, owner, target, request.getRadialOptions()); + if(getRadialFilename(target).equals("default")) + return; + + sendRadial(owner, target, request.getRadialOptions(), request.getRadialCount()); + + } + + }); + + swgOpcodes.put(Opcodes.ObjectSelectMenuMessage, new INetworkRemoteEvent() { + + @Override + public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + data.order(ByteOrder.LITTLE_ENDIAN); + data.position(0); + + ObjectMenuSelect objMenuSelect = new ObjectMenuSelect(); + objMenuSelect.deserialize(data); + + Client client = core.getClient((Integer) session.getAttribute("connectionId")); + + if(client == null || client.getSession() == null) + return; + + SWGObject owner = client.getParent(); + SWGObject target = core.objectService.getObject(objMenuSelect.getObjectId()); + + if(target == null || owner == null) + return; + + core.scriptService.callScript("scripts/radial/", getRadialFilename(target), "handleSelection", core, owner, target, objMenuSelect.getSelection()); + + } + + }); + + } + + @Override + public void shutdown() { + // TODO Auto-generated method stub + + } + + public String getRadialFilename(SWGObject object) { + + if(object.getAttachment("radial_filename") != null) + return (String) object.getAttachment("radial_filename"); + else + return "default"; + + } + + public void sendRadial(SWGObject owner, SWGObject target, Vector radialOptions, byte radialCount) { + + ObjectMenuResponse response = new ObjectMenuResponse(owner.getObjectID(), target.getObjectID(), radialOptions, radialCount); + + ObjControllerMessage objController = new ObjControllerMessage(0x0B, response); + + if(owner.getClient() != null && owner.getClient().getSession() != null) + owner.getClient().getSession().write(objController.serialize()); + } }