diff --git a/ngengine_public.jar b/ngengine_public.jar index fc381546..079df450 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/src/protocol/swg/auctionManagerClientListener/AuctionQueryHeadersResponseMessage.java b/src/protocol/swg/auctionManagerClientListener/AuctionQueryHeadersResponseMessage.java index 7c278c36..fa025157 100644 --- a/src/protocol/swg/auctionManagerClientListener/AuctionQueryHeadersResponseMessage.java +++ b/src/protocol/swg/auctionManagerClientListener/AuctionQueryHeadersResponseMessage.java @@ -98,19 +98,19 @@ public class AuctionQueryHeadersResponseMessage extends SWGMessage { result.putInt((int) ((item.getExpireTime() - System.currentTimeMillis()) / 1000)); result.putInt(item.getPrice()); result.putShort((short) getStringIndex(item.getVuid())); - result.putInt(0); + result.putLong(item.getOwnerId()); + result.putShort((short) getStringIndex(item.getOwnerName())); + /*result.putInt(0); result.put((byte) 0); result.putShort((short) getStringIndex(item.getOwnerName())); - result.put((byte) 0); - result.put((byte) (item.isAuction() ? 0 : 1)); + result.put((byte) 0);*/ result.putLong(0); - result.put((byte) 0); result.putInt(2); // unk result.putInt(0); result.putShort((short) 0); result.putInt(item.getItemType()); // gameObjectType/category bitmask - result.putInt(0); // gameObjectType/category bitmask + result.putInt(0); int options = 0; if(item.getOwnerId() == playerId && (item.getStatus() == AuctionItem.OFFERED || item.getStatus() == AuctionItem.FORSALE)) diff --git a/src/protocol/swg/auctionManagerClientListener/CommoditiesItemTypeListResponse.java b/src/protocol/swg/auctionManagerClientListener/CommoditiesItemTypeListResponse.java index d299a44e..cbf52fe3 100644 --- a/src/protocol/swg/auctionManagerClientListener/CommoditiesItemTypeListResponse.java +++ b/src/protocol/swg/auctionManagerClientListener/CommoditiesItemTypeListResponse.java @@ -22,31 +22,76 @@ package protocol.swg.auctionManagerClientListener; import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import main.NGECore; import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.buffer.SimpleBufferAllocator; +import engine.resources.objects.SWGObject; import protocol.swg.SWGMessage; +import services.bazaar.AuctionItem; public class CommoditiesItemTypeListResponse extends SWGMessage { + + private Map> itemList = new HashMap>(); + private static SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); + + public void addItem(AuctionItem item) { + if(itemList.get(item.getItemType()) == null) + itemList.put(item.getItemType(), new ArrayList()); + itemList.get(item.getItemType()).add(item); + } @Override public void deserialize(IoBuffer data) { // TODO Auto-generated method stub } + /** + * Struct of category lists: + * int numberofcategories + * + * int category + * number of items in category + * + * int server crc (w/o shared_) + * int category + * astring stf filename + * int spacer + * astring stf name + * + */ @Override public IoBuffer serialize() { - // TODO: research how categories work String galaxy = NGECore.getInstance().getGalaxyName(); - IoBuffer result = IoBuffer.allocate(14 + galaxy.length()).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer result = bufferPool.allocate(14 + galaxy.length(), false).order(ByteOrder.LITTLE_ENDIAN); + result.setAutoExpand(true); result.putShort((short) 2); result.putInt(0xD4E937FC); - result.put(getAsciiString(galaxy + ".0")); - result.putInt(0); - return result.flip(); + result.put(getAsciiString(galaxy + "." + Integer.toString(itemList.size()))); + result.putInt(itemList.size()); + + for(Entry> e : itemList.entrySet()) { + result.putInt(e.getKey()); + result.putInt(e.getValue().size()); + for(AuctionItem item : e.getValue()) { + result.putInt(item.getItemTypeCRC()); + result.putInt(item.getItemType()); + result.put(item.getItem().getObjectName().getBytes()); + } + } + + int size = result.position(); + IoBuffer result2 = IoBuffer.allocate(size).put(result.array(), 0, size); + + return result2.flip(); } } diff --git a/src/services/bazaar/AuctionItem.java b/src/services/bazaar/AuctionItem.java index 4e0d2fca..0c8d23be 100644 --- a/src/services/bazaar/AuctionItem.java +++ b/src/services/bazaar/AuctionItem.java @@ -41,6 +41,7 @@ public class AuctionItem implements Comparable, Serializable { private long buyerId; private long offerToId; private int itemType; + private int itemTypeCRC; private String ownerName; private String bidderName = ""; private String itemName; @@ -51,7 +52,7 @@ public class AuctionItem implements Comparable, Serializable { private boolean auction; private String vuid; private int status; - private boolean onBazaar; + private boolean onBazaar = false; private long expireTime; private int auctionOptions; @@ -278,5 +279,13 @@ public class AuctionItem implements Comparable, Serializable { else return 0; } + + public int getItemTypeCRC() { + return itemTypeCRC; + } + + public void setItemTypeCRC(int itemTypeCRC) { + this.itemTypeCRC = itemTypeCRC; + } } diff --git a/src/services/bazaar/BazaarService.java b/src/services/bazaar/BazaarService.java index 32f760a2..98a85288 100644 --- a/src/services/bazaar/BazaarService.java +++ b/src/services/bazaar/BazaarService.java @@ -22,7 +22,9 @@ package services.bazaar; import java.nio.ByteOrder; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -30,8 +32,12 @@ import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; + + + import main.NGECore; import engine.clients.Client; +import engine.resources.common.CRC; import engine.resources.database.ODBCursor; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -112,7 +118,16 @@ public class BazaarService implements INetworkDispatch { if (player == null) return; - + + CommoditiesItemTypeListResponse response = new CommoditiesItemTypeListResponse(); + + List insertedItems = new ArrayList(); + auctionItems.stream().filter(i -> !insertedItems.contains(i.getItem().getObjectName().getStfValue())).forEach(i -> { + response.addItem(i); + insertedItems.add(i.getItem().getObjectName().getString()); + System.out.println(i.getItem().getObjectName().getString()); + }); + session.write(new CommoditiesItemTypeListResponse().serialize()); }); @@ -359,7 +374,7 @@ public class BazaarService implements INetworkDispatch { if(vendor == null) return; - getItemData(player, vendor, queryHeaders.getRange(), queryHeaders.getScreen(), queryHeaders.getCounter(), queryHeaders.getOffset(), queryHeaders.getItemTypeCRC(), queryHeaders.getMinPrice(), queryHeaders.getMaxPrice()); + getItemData(player, vendor, queryHeaders.getRange(), queryHeaders.getScreen(), queryHeaders.getCounter(), queryHeaders.getOffset(), queryHeaders.getCategory(), queryHeaders.getMinPrice(), queryHeaders.getMaxPrice()); }); @@ -531,7 +546,6 @@ public class BazaarService implements INetworkDispatch { int displayedItems = 0; AuctionQueryHeadersResponseMessage response = new AuctionQueryHeadersResponseMessage(player.getObjectID(), screen, counter, offset, false); - while(it.hasNext() && displayedItems < offset + 100) { AuctionItem item = it.next(); @@ -544,10 +558,12 @@ public class BazaarService implements INetworkDispatch { // Auctions case 2: if(item.getStatus() == AuctionItem.FORSALE && item.isOnBazaar()) { - if((category & 255) != 0 && item.getItemType() == category) { - if(displayedItems >= offset) - response.addItem(item); - displayedItems++; + if((category & 255) != 0) { + if(item.getItemType() == category) { + if(displayedItems >= offset) + response.addItem(item); + displayedItems++; + } } else if((item.getItemType() & category) != 0) { if(displayedItems >= offset) response.addItem(item); @@ -726,16 +742,17 @@ public class BazaarService implements INetworkDispatch { auctionItem.setItemDescription(description); auctionItem.setPrice(price); auctionItem.setItemType(item.getTemplateData().getAttribute("gameObjectType")); + auctionItem.setItemTypeCRC(CRC.StringtoCRC(item.getTemplate().replace("shared_", ""))); auctionItem.setStatus(AuctionItem.FORSALE); //auctionItem.setItemName("@" + item.getStfFilename() + ":" + item.getStfName()); - String name = item.getCustomName() == null ? "@" + item.getStfFilename() + ":" + item.getStfName() : item.getCustomName(); + String name = item.getCustomName() == null ? item.getObjectName().getStfValue() : item.getCustomName(); auctionItem.setItemName(name); auctionItem.setVendorId(vendor.getObjectID()); auctionItem.setPlanet(vendor.getPlanet().getName()); auctionItem.setVuid(getVendorUID((TangibleObject) vendor)); auctionItem.setOwnerName(player.getCustomName()); - if(vendor.getTemplate().contains("terminal_bazaar")) + if(vendor.getAttachment("isVendor") == null) auctionItem.setOnBazaar(true); else { if(!((long) vendor.getAttachment("vendorOwner") == player.getObjectID())) {