diff --git a/scripts/conversation/junk_dealer.py b/scripts/conversation/junk_dealer.py index 8259d519..ba6782b4 100644 --- a/scripts/conversation/junk_dealer.py +++ b/scripts/conversation/junk_dealer.py @@ -7,7 +7,19 @@ from services.sui.SUIWindow import Trigger from java.util import Vector import sys +sellItemListRef = 0 +buyItemListRef = 0 +coreRef = 0 +junkDealerRef = 0 + def startConversation(core, actor, npc): + core.lootService.prepInv(actor) + global coreRef + global junkDealerRef + global sellItemListRef + sellItemListRef = core.lootService.getSellableInventoryItems(actor) + coreRef = core + junkDealerRef = npc convSvc = core.conversationService prose = ProsePackage('conversation/junk_dealer_generic', 's_bef51e38') outOfBand = OutOfBand() @@ -25,10 +37,19 @@ def startConversation(core, actor, npc): option1 = ConversationOption(outOfBand2, 0) option2 = ConversationOption(outOfBand3, 1) option3 = ConversationOption(outOfBand4, 1) + options = Vector() options.add(option1) options.add(option2) options.add(option3) + + if core.lootService.getBuyHistory(actor,npc)!=None: + prose5 = ProsePackage('conversation/junk_dealer_generic', 's_43') + outOfBand5 = OutOfBand() + outOfBand5.addProsePackage(prose5) + option4 = ConversationOption(outOfBand5, 1) + options.add(option4) + convSvc.sendConversationOptions(actor, npc, options, handleFirstScreen) return @@ -36,18 +57,28 @@ def handleFirstScreen(core, actor, npc, selection): if selection == 0: # sell items - - window = core.suiService.createSUIWindow('Script.listBox', actor, npc, 0); - window.setProperty('bg.caption.lblTitle:Text', '@loot_dealer:sell_title'); - window.setProperty('Prompt.lblPrompt:Text', '@loot_dealer:sell_prompt'); - - for item in actor.getinventoryitems(): + + sellItemListRef = core.lootService.getSellableInventoryItems(actor) + + if len(sellItemListRef) == 0: + actor.sendSystemMessage('@loot_dealer:no_items', 1) + startConversation(coreRef,actor,junkDealerRef) + return # no point + + window = core.suiService.createSUIWindow('Script.listBox', actor, npc, 0) + window.setProperty('bg.caption.lblTitle:Text', '@loot_dealer:sell_title') + window.setProperty('Prompt.lblPrompt:Text', '@loot_dealer:sell_prompt') + + + + for item in sellItemListRef: window.addListBoxMenuItem(item.getCustomName(), 0); + actor.sendSystemMessage('ddf ' + item.getCustomName(), 1) window.setProperty('btnOther:visible', 'True') window.setProperty('btnCancel:visible', 'True') window.setProperty('btnOk:visible', 'True') - window.setProperty('btnOther:Text', 'Examine Item') + window.setProperty('btnOther:Text', '@loot_dealer:examine') window.setProperty('btnCancel:Text', '@cancel') window.setProperty('btnOk:Text', '@loot_dealer:btn_sell') returnList = Vector() @@ -61,28 +92,70 @@ def handleFirstScreen(core, actor, npc, selection): return if selection == 1: - # expertise reset - # TODO: check for prices - convSvc = core.conversationService - prose = ProsePackage('conversation/junk_dealer_generic', 's_35') - outOfBand = OutOfBand() - outOfBand.addProsePackage(prose) - convSvc.sendConversationMessage(actor, npc, outOfBand) - prose2 = ProsePackage('conversation/junk_dealer_generic', 's_71') - outOfBand2 = OutOfBand() - outOfBand2.addProsePackage(prose2) - prose3 = ProsePackage('conversation/junk_dealer_generic', 's_72') - outOfBand3 = OutOfBand() - outOfBand3.addProsePackage(prose3) - option1 = ConversationOption(outOfBand2, 0) - option2 = ConversationOption(outOfBand3, 1) - options = Vector() - options.add(option1) - options.add(option2) - convSvc.sendConversationOptions(actor, npc, options, handleResetScreen) + # mark items + window = core.suiService.createSUIWindow('Script.listBox', actor, npc, 0) + window.setProperty('bg.caption.lblTitle:Text', '@loot_dealer:junk_no_sell_title') + window.setProperty('Prompt.lblPrompt:Text', '@loot_dealer:junk_no_sell_desc') + + sellItemListRef = core.lootService.getSellableInventoryItems(actor) + + for item in sellItemListRef: + nameString = item.getCustomName() + nameString = 'TestJunkItem' + if item.isNoSell(): + nameString = '[*No Sell*]' + item.getCustomName() + window.addListBoxMenuItem(nameString, 0) + else: + nameString = '[*Sell*]' + item.getCustomName() + window.addListBoxMenuItem(nameString, 0) + + window.setProperty('btnOther:visible', 'True') + window.setProperty('btnCancel:visible', 'True') + window.setProperty('btnOk:visible', 'True') + window.setProperty('btnOther:Text', '@loot_dealer:examine') + window.setProperty('btnCancel:Text', '@cancel') + window.setProperty('btnOk:Text', '@loot_dealer:junk_no_sell_button') + returnList = Vector() + returnList.add('List.lstList:SelectedRow') + + #window.addHandler(0, '', Trigger.TRIGGER_OK, returnList, noSellWindowCallBack) + #window.addHandler(1, '', Trigger.TRIGGER_CANCEL, returnList, noSellWindowCallBack) + window.addHandler(0, '',9, returnList, noSellWindowCallBack) + window.addHandler(1, '',10, returnList, noSellWindowCallBack) + window.addHandler(2, '',11, returnList, noSellWindowCallBack) + core.suiService.openSUIWindow(window); + return + + if selection == 3: + # buy back - - return + window = core.suiService.createSUIWindow('Script.listBox', actor, npc, 0) + window.setProperty('bg.caption.lblTitle:Text', '@loot_dealer:buy_back_title') + window.setProperty('Prompt.lblPrompt:Text', '@loot_dealer:buy_back_prompt') + + buyHistory = core.lootService.getBuyHistory(actor,junkDealerRef) + if buyHistory==None: + return + + for item in buyHistory: + nameString = '[%s' % 100 + ']' + item.getCustomName() #%item.getJunkDealerPrice() + window.addListBoxMenuItem(nameString, 0) + + window.setProperty('btnOther:visible', 'True') + window.setProperty('btnCancel:visible', 'True') + window.setProperty('btnOk:visible', 'True') + window.setProperty('btnOther:Text', '@loot_dealer:examine') + window.setProperty('btnCancel:Text', '@cancel') + window.setProperty('btnOk:Text', '@loot_dealer:btn_buy_back') + returnList = Vector() + returnList.add('List.lstList:SelectedRow') + + window.addHandler(0, '', Trigger.TRIGGER_OK, returnList, buyBackWindowCallBack) + window.addHandler(1, '', Trigger.TRIGGER_CANCEL, returnList, buyBackWindowCallBack) + window.addHandler(2, '', Trigger.TRIGGER_UPDATE, returnList, buyBackWindowCallBack) + core.suiService.openSUIWindow(window); + + return def handleRespecScreen(core, actor, npc, selection): @@ -109,14 +182,142 @@ def endConversation(core, actor, npc): def sellWindowCallBack(owner, window, eventType, returnList): - - if eventType == 0 and len(returnList) == 2: - cashCredits = int(returnList.get(0)) - bankCredits = int(returnList.get(1)) - - if bankCredits + cashCredits == owner.getCashCredits() + owner.getBankCredits(): - owner.setCashCredits(cashCredits) - owner.setBankCredits(bankCredits) - owner.sendSystemMessage('@base_player:bank_success', 0) + + if returnList.get(0) == 0: + owner.sendSystemMessage("huh?", 1) + #startConversation(coreRef,owner,junkDealerRef) + return + + #sell + if eventType == 0: + + sellItem = sellItemListRef.get(int(returnList.get(0))) + + #if len(sellItemListRef): + #owner.sendSystemMessage('@junk_dealer:no_items', 1) + #return + + if sellItem == None: + owner.sendSystemMessage('@junk_dealer:no_items', 1) + return + + inventory = owner.getSlottedObject('inventory') + + + junkPrice = 20 + owner.setCashCredits(owner.getCashCredits()+junkPrice); + + # add item to 10-item junk dealer history + coreRef.lootService.addToBuyHistory(owner,junkDealerRef,sellItem) + + #You sell %TT for %DI credits. + owner.sendSystemMessage("sold "+sellItem.getCustomName(), 1) + #owner.sendSystemMessage(ProsePackage("@junk_dealer:prose_sold_junk", "TT", sellItem.getCustomName()), 0) + + inventory.remove(sellItem) + + coreRef.suiService.closeSUIWindow(owner,window.getWindowId()); + handleFirstScreen(coreRef, owner, junkDealerRef, 0) + return + + #cancel + if eventType == 1: + owner.sendSystemMessage("cancel ", 1) + #coreRef.suiService.closeSUIWindow(window,window.getWindowId()); + #startConversation(coreRef,owner,junkDealerRef) + return + + #examine + if eventType == 2: + owner.sendSystemMessage("examine ", 1) + #coreRef.suiService.closeSUIWindow(window,window.getWindowId()); + #startConversation(coreRef,owner,junkDealerRef) + #owner.sendSystemMessage('Examine', 0) + return + return + +def noSellWindowCallBack(owner, window, eventType, returnList): + + if returnList.get(0) == 0: + startConversation(coreRef,owner,junkDealerRef) + return + + #toggle + if eventType == 0: + owner.sendSystemMessage('Toggle', 0) + toggleItem = sellItemListRef.get(int(returnList.get(0))) + if toggleItem.isNoSell(): + toggleItem.setNoSell(0) + else: + toggleItem.setNoSell(1) + + #core.suiService.closeSUIWindow(window); + handleFirstScreen(coreRef, owner, junkDealerRef, 1) + return + + #cancel + if eventType == 1: + owner.sendSystemMessage('Cancle', 0) + sellItem = returnList.get(0) + startConversation(coreRef,owner,junkDealerRef) + return + + #examine + if eventType == 2: + owner.sendSystemMessage('Ex', 0) + sellItem = returnList.get(0) + startConversation(coreRef,owner,junkDealerRef) + owner.sendSystemMessage('Examine', 0) + return + +def buyBackWindowCallBack(owner, window, eventType, returnList): + + if returnList.get(0) == 0: + startConversation(coreRef,owner,junkDealerRef) + return + + #buy + if eventType == 0: + index = int(returnList.get(0)) + buyHistory = coreRef.lootService.getBuyHistory(owner,junkDealerRef) + if len(buyHistory) == 0: + owner.sendSystemMessage('@loot_dealer:no_buy_back_items_found', 1) + + buyBackItem = buyHistory.get(index) + + if buyBackItem == None: + owner.sendSystemMessage('@loot_dealer:no_buy_back_items_found', 0) + startConversation(coreRef,owner,junkDealerRef) + return + + junkPrice = 20 + if owner.getCashCredits()>=junkPrice and owner.getInventoryItemCount() < 80: + owner.setCashCredits(owner.getCashCredits()-junkPrice) + inventory = owner.getSlottedObject('inventory') + inventory.add(buyBackItem) + # remove from junk dealer history + coreRef.lootService.removeBoughtBackItemFromHistory(owner,junkDealerRef,buyBackItem) + else: + owner.sendSystemMessage('@loot_dealer:prose_no_buy_back', 0) + + coreRef.suiService.closeSUIWindow(owner,window.getWindowId()); + handleFirstScreen(coreRef, owner, junkDealerRef, 3) + return + + #cancel + if eventType == 1: + owner.sendSystemMessage('Cancle', 0) + sellItem = returnList.get(0) + startConversation(coreRef,owner,junkDealerRef) + return + + #examine + if eventType == 2: + owner.sendSystemMessage('Ex', 0) + sellItem = returnList.get(0) + startConversation(coreRef,owner,junkDealerRef) + owner.sendSystemMessage('Examine', 0) + return + \ No newline at end of file diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 80240884..04f72677 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -53,7 +53,7 @@ import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -@Persistent(version=9) +@Persistent(version=10) public class TangibleObject extends SWGObject { // TODO: Thread safety @@ -89,6 +89,11 @@ public class TangibleObject extends SWGObject { @NotPersistent private boolean lootItem = false; + private boolean noSell = false; + private byte junkType = -1; + private int junkDealerPrice = 0; + + private String serialNumber; @NotPersistent @@ -499,6 +504,30 @@ public class TangibleObject extends SWGObject { this.lootItem = lootItem; } + public boolean isNoSell() { + return noSell; + } + + public void setNoSell(boolean noSell) { + this.noSell = noSell; + } + + public byte getJunkType() { + return junkType; + } + + public void setJunkType(byte junkType) { + this.junkType = junkType; + } + + public int getJunkDealerPrice() { + return junkDealerPrice; + } + + public void setJunkDealerPrice(int junkDealerPrice) { + this.junkDealerPrice = junkDealerPrice; + } + public boolean isCreditRelieved() { return creditRelieved; } diff --git a/src/services/LootService.java b/src/services/LootService.java index ca40b77f..e8788c1d 100644 --- a/src/services/LootService.java +++ b/src/services/LootService.java @@ -29,8 +29,10 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; @@ -42,12 +44,14 @@ import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import resources.objects.loot.LootGroup; import resources.objects.loot.LootRollSession; +import resources.objects.resource.ResourceContainerObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; import main.NGECore; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.CrcStringTableVisitor; import engine.resources.common.CRC; +import engine.resources.container.Traverser; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -62,6 +66,7 @@ import engine.resources.service.INetworkRemoteEvent; public class LootService implements INetworkDispatch { private NGECore core; + private static int prepInvCnt = 0; public LootService(NGECore core) { this.core = core; @@ -784,6 +789,189 @@ public class LootService implements INetworkDispatch { } + // ********* Junk-dealer related ********* + + public Vector getSellableInventoryItems(CreatureObject actor){ + TangibleObject playerInventory = (TangibleObject) actor.getSlottedObject("inventory"); + final Vector sellableItems = new Vector(); + playerInventory.viewChildren(actor, false, false, new Traverser() { + @Override + public void process(SWGObject obj) { + String itemTemplate = obj.getTemplate(); + if (itemTemplate.contains("loot/")){ + sellableItems.add(obj); + } + } + }); + System.err.println("sellableItems " + sellableItems.size()); + return sellableItems; + } + + public void addToSoldHistory(CreatureObject actor, TangibleObject item){ + + } + + public boolean haveBusinessHistory(CreatureObject actor, CreatureObject dealer){ + return true; + } + + @SuppressWarnings("unchecked") + public Vector getBuyHistory(CreatureObject actor, CreatureObject dealer){ + LinkedHashMap businessHistory = (LinkedHashMap )dealer.getAttachment("BusinessHistory"); + if (businessHistory==null){ + businessHistory = new LinkedHashMap(); + dealer.setAttachment("BusinessHistory",businessHistory); + } + + TangibleObject[] actorsBuyHistory = businessHistory.get(actor.getObjectID()); + if (actorsBuyHistory==null) + return new Vector(); + + Vector actorHistory = new Vector(); + for (TangibleObject item : actorsBuyHistory){ + if (item!=null) + actorHistory.add(item); + } + return actorHistory; + } + + @SuppressWarnings("unchecked") + public boolean addToBuyHistory(CreatureObject actor, CreatureObject dealer, TangibleObject item){ + LinkedHashMap businessHistory = (LinkedHashMap )dealer.getAttachment("BusinessHistory"); + if (businessHistory==null){ + System.out.println("businessHistory==null"); + businessHistory = new LinkedHashMap(); + dealer.setAttachment("BusinessHistory",businessHistory); + } + System.out.println("abusinessHistory.size " + businessHistory.size()); + TangibleObject[] actorsBuyHistory = businessHistory.get(actor.getObjectID()); + if (actorsBuyHistory==null){ + System.out.println("actorsBuyHistory==null"); + actorsBuyHistory = new TangibleObject[10]; + actorsBuyHistory[0] = item; + } else { + // Check Array for zeros + int lastObject=0; + for (int i=0;i>shift right and add + for (int i = 8; i >= 0; i--) { + actorsBuyHistory[i+1] = actorsBuyHistory[i]; + } + actorsBuyHistory[0] = item; + } else { + actorsBuyHistory[lastObject+1] = item; + } + } + businessHistory.put(actor.getObjectID(),actorsBuyHistory); + dealer.setAttachment("BusinessHistory",businessHistory); + printArrayElements(actorsBuyHistory); + return true; + } + + public boolean removeBoughtBackItemFromHistory(CreatureObject actor, CreatureObject dealer, TangibleObject item){ + if (item==null) + return false; // Player has hit the button without selecting an item + LinkedHashMap businessHistory = (LinkedHashMap )dealer.getAttachment("BusinessHistory"); + if (businessHistory==null){ + return false; // something went seriously wrong. At this point the dealer should have a history + } + TangibleObject[] actorsBuyHistory = businessHistory.get(actor.getObjectID()); + if (actorsBuyHistory==null) + return false; // Player has no history entry + // Find the element index + int index = -1; + for (int i=0;i<10;i++){ + if (actorsBuyHistory[i]!=null){ + if (item.getObjectID()==actorsBuyHistory[i].getObjectID()){ + index = i; + } + } + } + + if (index==-1) + return false; + + // SHift everything to the right of the found index to the left + for (int i = index; i < 9; i++) { + actorsBuyHistory[i] = actorsBuyHistory[i+1]; // 0 1 2 3 4 5 6 7 8 9 + } + if (index!=-1) + actorsBuyHistory[9]=null; + + businessHistory.put(actor.getObjectID(),actorsBuyHistory); + dealer.setAttachment("BusinessHistory",businessHistory); + printArrayElements(actorsBuyHistory); + return true; + } + + + // util method + private void printArrayElements(TangibleObject[] array){ + System.out.print("Array ["); + for (int i=0;i0) + return; + prepInvCnt++; + SWGObject playerInventory = player.getSlottedObject("inventory"); + TangibleObject item1 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_impulse_detector_01_generic.iff", player.getPlanet()); + item1.setCustomName("Impulse Detector"); + playerInventory.add(item1); + + TangibleObject item2 = (TangibleObject)core.objectService.createObject("object/tangible/loot/misc/shared_damaged_datapad.iff", player.getPlanet()); + item2.setCustomName("Damaged Datapad"); + playerInventory.add(item2); + + TangibleObject item3 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_software_module_generic.iff", player.getPlanet()); + item3.setCustomName("Software Module"); + playerInventory.add(item3); + + TangibleObject item4 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_survival_equipment_generic.iff", player.getPlanet()); + item4.setCustomName("Survival Gear"); + playerInventory.add(item4); + + TangibleObject item5 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_shield_module_generic.iff", player.getPlanet()); + item5.setCustomName("Shield Module"); + playerInventory.add(item5); + + TangibleObject item6 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_firework_generic.iff", player.getPlanet()); + item6.setCustomName("Explosive Dud"); + playerInventory.add(item6); + + TangibleObject item7 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_launcher_tube_generic.iff", player.getPlanet()); + item7.setCustomName("Launcher Tube"); + playerInventory.add(item7); + + TangibleObject item8 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_red_wiring_generic.iff", player.getPlanet()); + item8.setCustomName("Red Wiring"); + playerInventory.add(item8); + + TangibleObject item9 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_laser_trap_generic.iff", player.getPlanet()); + item9.setCustomName("Laser Trap"); + playerInventory.add(item9); + + TangibleObject item10 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_comlink_civilian_generic.iff", player.getPlanet()); + item10.setCustomName("Comlink"); + playerInventory.add(item10); + + TangibleObject item11 = (TangibleObject)core.objectService.createObject("object/tangible/loot/npc_loot/shared_armor_repair_device_generic.iff", player.getPlanet()); + item11.setCustomName("Armor Repair Device"); + playerInventory.add(item11); + } + + /* 1377 wpn_category_0 Rifle 1378 wpn_category_1 Carbine