Conversation menu improvements

SUI window functionality
storage of items in collections
This commit is contained in:
CharonInferar
2014-04-18 21:52:03 +02:00
parent e32cb2da0b
commit 73a3c98660
3 changed files with 456 additions and 38 deletions
+238 -37
View File
@@ -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
@@ -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;
}
+188
View File
@@ -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<SWGObject> getSellableInventoryItems(CreatureObject actor){
TangibleObject playerInventory = (TangibleObject) actor.getSlottedObject("inventory");
final Vector<SWGObject> sellableItems = new Vector<SWGObject>();
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<TangibleObject> getBuyHistory(CreatureObject actor, CreatureObject dealer){
LinkedHashMap<Long,TangibleObject[]> businessHistory = (LinkedHashMap<Long,TangibleObject[]> )dealer.getAttachment("BusinessHistory");
if (businessHistory==null){
businessHistory = new LinkedHashMap<Long,TangibleObject[]>();
dealer.setAttachment("BusinessHistory",businessHistory);
}
TangibleObject[] actorsBuyHistory = businessHistory.get(actor.getObjectID());
if (actorsBuyHistory==null)
return new Vector<TangibleObject>();
Vector<TangibleObject> actorHistory = new Vector<TangibleObject>();
for (TangibleObject item : actorsBuyHistory){
if (item!=null)
actorHistory.add(item);
}
return actorHistory;
}
@SuppressWarnings("unchecked")
public boolean addToBuyHistory(CreatureObject actor, CreatureObject dealer, TangibleObject item){
LinkedHashMap<Long,TangibleObject[]> businessHistory = (LinkedHashMap<Long,TangibleObject[]> )dealer.getAttachment("BusinessHistory");
if (businessHistory==null){
System.out.println("businessHistory==null");
businessHistory = new LinkedHashMap<Long,TangibleObject[]>();
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<actorsBuyHistory.length;i++){
if (actorsBuyHistory[i]!=null)
lastObject=i;
}
if (lastObject==actorsBuyHistory.length-1){
//>>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<Long,TangibleObject[]> businessHistory = (LinkedHashMap<Long,TangibleObject[]> )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;i<array.length;i++){
if (array[i]!=null){
//System.out.print(array[i].getObjectID() + ", ");
System.out.print(array[i].getCustomName() + ", ");
}
}
System.out.print("]");
}
public void prepInv(CreatureObject player){
if (prepInvCnt>0)
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