Рейтинг темы:
  • 1 Голос(ов) - 5 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Item Mall/Prime Shop что такое и с чем его едят?
#81
VISTALL Написал:and dont use source of any public projects

Also Official L2jServer? If so, what do i have to do?
Ответ
#82
Самый главный вопрос который нужно было разместить на первом посте - с каких хроник эта плюшка доступна.
Классический Interlude PvP сервер http://akamanah.ru/
Ответ
#83
Реализация взято из l2f и переделано ,им собственно и спасибо , для себя делал тоже отталкиваясь от их кода - не копипастил !

Item Mall для серверов типа l2f/l2p/l2open/l2nextgen/sunwars/шайтан и т.д.

Портировал код на феникс по много численным просьбам и выкладываю собственно ... портировал не абсолютно все (RequestBR_GamePoint - Листнер на количество не отображается но консьюмит итемы ровно , так что не писяйте. Для себя доделал все и корректно , но простите за бесплатно даже котята не рождаются) в коде используется за базовый итем для продажи Coin of Lack id=4037

VISTALL вот вот вот вот вот вот вот вот вот вот вот вот вот вот вот вот вот вот вот вотвот вот вот вот вот вот вот вот вот вотвот вот вот вот вот вот вот вот вот вотвот вот вот вот вот вот вот вот вот вотвот вот вот вот вот вот вот вот вот вот :negodue: :negodue: :negodue: :negodue: :negodue: :negodue: и ГЦ с новым статусом на форуме

В выделенным жирным классы рвет пробелами - непонятно почему , видимо ошибка форума.

1)l2p\gameserver\instancemanager\PrimeShopManager.java
package l2p.gameserver.instancemanager;

import l2p.Config;
import l2p.database.DatabaseUtils;
import l2p.database.FiltredPreparedStatement;
import l2p.database.L2DatabaseFactory;
import l2p.database.ThreadConnection;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.items.L2ItemInstance;
import l2p.gameserver.serverpackets.*;
import l2p.util.ValueSortMap;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.sql.ResultSet;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;

public class PrimeShopManager {
private static Logger _log = Logger.getLogger(PrimeShopManager.class.getName());

private static PrimeShopManager _instance;

public final int BR_BUY_SUCCESS = 1;
public final int BR_BUY_LACK_OF_POINT = -1;
public final int BR_BUY_INVALID_PRODUCT = -2;
public final int BR_BUY_USER_CANCEL = -3;
public final int BR_BUY_INVENTROY_OVERFLOW = -4;
public final int BR_BUY_CLOSED_PRODUCT = -5;
public final int BR_BUY_SERVER_ERROR = -6;
public final int BR_BUY_BEFORE_SALE_DATE = -7;
public final int BR_BUY_AFTER_SALE_DATE = -8;
public final int BR_BUY_INVALID_USER = -9;
public final int BR_BUY_INVALID_ITEM = -10;
public final int BR_BUY_INVALID_USER_STATE = -11;
public final int BR_BUY_NOT_DAY_OF_WEEK = -12;
public final int BR_BUY_NOT_TIME_OF_DAY = -13;
public final int BR_BUY_SOLD_OUT = -14;
public final int MAX_BUY_COUNT = 99;
public final int CURRENCY_ID = 4037;
private HashMap<Integer, ItemMallItemTemplate> brTemplates;
private HashMap<Integer, ItemMallItem> shop;
protected ExBR_ProductList list;
private ConcurrentHashMap<Integer, List<ItemMallItem>> recentList;

public static PrimeShopManager getInstance() {
if (_instance == null)
_instance = new PrimeShopManager();
return _instance;
}

private PrimeShopManager() {
brTemplates = new HashMap<Integer, ItemMallItemTemplate>();
shop = new HashMap<Integer, ItemMallItem>();
list = null;
recentList = new ConcurrentHashMap<Integer, List<ItemMallItem>>();
load();
}

public void requestBuyItem(L2Player player, int brId, int count) {
if (count > MAX_BUY_COUNT)
count = MAX_BUY_COUNT;
if (count < 1)
count = 1;

ItemMallItem item = shop.get(brId);
if (item == null) {
sendResult(player, BR_BUY_INVALID_PRODUCT);
return;
}

if (player.getInventory().getCountOf(CURRENCY_ID) < item.price * count) {
sendResult(player, BR_BUY_LACK_OF_POINT);
return;
}

Calendar cal = Calendar.getInstance();
if (item.iStartSale > 0 && (item.iStartSale > (int) (cal.getTimeInMillis() / 1000))) {
sendResult(player, BR_BUY_BEFORE_SALE_DATE);
return;
}

if (item.iEndSale > 0 && (item.iEndSale < (int) (cal.getTimeInMillis() / 1000))) {
sendResult(player, BR_BUY_AFTER_SALE_DATE);
return;
}

if (item.iStartHour != 0 || item.iStartMin != 0 || item.iEndHour != 0 || item.iEndMin != 0) {
if ((item.iStartHour > cal.get(Calendar.HOUR_OF_DAY) && item.iStartMin > cal.get(Calendar.HOUR_OF_DAY)) ||
(item.iEndHour < cal.get(Calendar.HOUR_OF_DAY) && item.iEndMin < cal.get(Calendar.HOUR_OF_DAY))) {
sendResult(player, BR_BUY_NOT_TIME_OF_DAY);
return;
}
}

if (item.isLimited() && (item.limit() || item.iMaxStock - item.iStock < count)) {
sendResult(player, BR_BUY_SOLD_OUT);
return;
}

player.getInventory().destroyItemByItemId(CURRENCY_ID, (item.price * count), true);

player.sendMessage("You have successfully used your " + (item.price * count) + " points.");

L2ItemInstance dummy = new L2ItemInstance(0, item.template.itemId);
if (dummy.isStackable()) {
if (!player.getInventory().validateWeight(dummy.getItem().getWeight() * item.count * count)) {
sendResult(player, BR_BUY_INVENTROY_OVERFLOW);
return;
}

if (player.getInventory().getItemByItemId(item.template.itemId) == null && !player.getInventory().validateCapacity(1)) {
sendResult(player, BR_BUY_INVENTROY_OVERFLOW);
return;
}

player.getInventory().addItem(item.template.itemId, 1);
player.sendPacket(new SystemMessage(53).addItemName(item.template.itemId).addNumber(count));
} else {
if (!player.getInventory().validateCapacity(item.count * count) || !player.getInventory().validateWeight(dummy.getItem().getWeight() * item.count * count)) {
sendResult(player, BR_BUY_INVENTROY_OVERFLOW);
return;
}

for (int i = 0; i < count * item.count; i++) {
player.getInventory().addItem(item.template.itemId, 1);
player.sendPacket(new SystemMessage(54).addItemName(item.template.itemId));
}
}

if (item.isLimited()) {
synchronized (item) {
item.iStock += count;
}
}
item.iSale += count;
if (recentList.get(player.getObjectId()) == null) {
List<ItemMallItem> charList = new ArrayList<ItemMallItem>();
charList.add(item);
recentList.put(player.getObjectId(), charList);
} else {
recentList.get(player.getObjectId()).add(item);
}

sendResult(player, BR_BUY_SUCCESS);
}

public void load() {
loadTempaltes();
loadShop();
}

public void loadTempaltes() {
brTemplates = new HashMap<Integer, ItemMallItemTemplate>();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setIgnoringComments(true);

final File file = new File(Config.DATAPACK_ROOT + "/data/prime_shop.xml");
final Document doc = factory.newDocumentBuilder().parse(file);

for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
if ("list".equalsIgnoreCase(n.getNodeName())) {
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
if ("item".equalsIgnoreCase(d.getNodeName())) {
NamedNodeMap attrs = d.getAttributes();

int brId = Integer.parseInt(attrs.getNamedItem("brId").getNodeValue());
int itemId = 0;
try {
itemId = Integer.parseInt(attrs.getNamedItem("itemId").getNodeValue());
} catch (NumberFormatException e) {
}
if (itemId == 0)
continue;

int cat = Integer.parseInt(attrs.getNamedItem("category").getNodeValue());

ItemMallItemTemplate csit = new ItemMallItemTemplate();
csit.brId = brId;
csit.itemId = itemId;
csit.category = cat;

brTemplates.put(csit.itemId, csit);
}
}
} catch (Exception e) {
_log.severe("ItemShop: Error parsing prime_shop.xml file. ");
e.printStackTrace();
}

_log.info("ItemShop: loaded " + brTemplates.size() + " item templates.");
}

@SuppressWarnings("unchecked")
public void loadShop() {
shop = new HashMap<Integer, ItemMallItem>();
ThreadConnection con = null;
FiltredPreparedStatement statement = null;
ResultSet result = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
statement = con.prepareStatement("SELECT * FROM prime_shop WHERE onSale=1 ORDER BY ord");
result = statement.executeQuery();
while (result.next()) {
int vsm = result.getInt("itemId");

ItemMallItemTemplate template = brTemplates.get(vsm);

if (template == null) {
_log.warning("ItemShop: item template for " + vsm + " was not found. skipping.");
continue;
}

ItemMallItem item = new ItemMallItem(template);
item.count = result.getInt("count");
item.price = result.getInt("price");
item.order = result.getInt("ord");
item.iCategory2 = result.getInt("iCategory2");
item.iStartSale = result.getInt("iStartSale");
item.iEndSale = result.getInt("iEndSale");
item.iStartHour = result.getInt("iStartHour");
item.iStartMin = result.getInt("iStartMin");
item.iEndHour = result.getInt("iEndHour");
item.iEndMin = result.getInt("iEndMin");
item.iStock = result.getInt("iStock");
item.iMaxStock = result.getInt("iMaxStock");

L2ItemInstance dummy = new L2ItemInstance(0, vsm);
item.iWeight = dummy.getItem().getWeight();
item.iDropable = dummy.getItem().isDropable();
shop.put(item.template.brId, item);
}
} catch (final Exception e) {
_log.warning("ItemMall: error load() " + e);
} finally {
DatabaseUtils.closeDatabaseCSR(con, statement, result);
}
_log.info("ItemMall: loaded " + shop.size() + " items available for trading.");
list = new ExBR_ProductList();
ValueSortMap vsm = new ValueSortMap();
Map<ItemMallItem, Integer> data = new LinkedHashMap<ItemMallItem, Integer>();

for (ItemMallItem imi : shop.values()) {
data.put(imi, imi.order);
}

data = vsm.sortMapByValue(data, true);
list.col = data.keySet();
}

public void saveData() {
ThreadConnection con = null;
FiltredPreparedStatement statement = null;
try {
con = L2DatabaseFactory.getInstance().getConnection();
for (ItemMallItem imi : shop.values()) {
if (imi.isLimited()) {
statement = con.prepareStatement("UPDATE prime_shop set iStock=? where ord=?");
statement.setInt(1, imi.iStock);
statement.setInt(2, imi.order);
statement.executeUpdate();
statement.close();
}
}
System.out.println("ItemMall: Data saved.");
} catch (final Exception e) {
System.out.println("ItemMall: error in saveData() " + e);
} finally {
DatabaseUtils.closeDatabaseCS(con, statement);
}
}

public void sendResult(L2Player player, int code) {
player.sendPacket(new ExBR_BuyProductResult(code));
}


public void showList(L2Player player) {
player.sendPacket(list);
}

public void showItemInfo(L2Player player, int brId) {
ItemMallItem item = shop.get(brId);
if (item == null) {
sendResult(player, BR_BUY_INVALID_ITEM);
return;
}

player.sendPacket(new ExBR_ProductInfo(item));
}

public class ItemMallItem {
public ItemMallItemTemplate template = null;
public int count;
public int price;
public int order;
public int iSale = 0;
public int iDayWeek;
public int iCategory2;
public int iStartSale;
public int iEndSale;
public int iStartHour;
public int iStartMin;
public int iEndHour;
public int iEndMin;
public int iStock;
public int iMaxStock;

public int iWeight;
public boolean iDropable;

public ItemMallItem(ItemMallItemTemplate t) {
template = t;
}

public boolean limit() {
return iStock >= iMaxStock;
}

public boolean isLimited() {
return iMaxStock > 0;
}
}

public class ItemMallItemTemplate {
public int brId;
public int itemId;
public int category;
}

public void recentProductList(L2Player player) {
player.sendPacket(new ExBR_RecentProductListPacket(player.getObjectId()));
}

public List<ItemMallItem> getRecentListByOID(int objId) {
return recentList.get(objId) == null ? new ArrayList<ItemMallItem>() : recentList.get(objId);
}
}

2)l2p\gameserver\clientpackets\RequestBR_BuyProduct.java
package l2p.gameserver.clientpackets;

import l2p.gameserver.instancemanager.PrimeShopManager;
import l2p.gameserver.model.L2Player;

public class RequestBR_BuyProduct extends L2GameClientPacket {
private int iProductID;
private int iAmount;

public void readImpl() {
iProductID = readD();
iAmount = readD();
}

public void runImpl() {
L2Player player = getClient().getActiveChar();

if (player == null)
return;
else
PrimeShopManager.getInstance().requestBuyItem(player, iProductID, iAmount);
}
}

3)l2p\gameserver\clientpackets\RequestBR_GamePoint.java
package l2p.gameserver.clientpackets;


import l2p.gameserver.instancemanager.PrimeShopManager;
import l2p.gameserver.model.L2Player;

public class RequestBR_GamePoint extends L2GameClientPacket {
@Override
public void readImpl() {
}

@Override
public void runImpl() {
L2Player activeChar = getClient().getActiveChar();

if (activeChar == null)
return;
}
}

4)l2p\gameserver\clientpackets\RequestBR_ProductInfo.java

package l2p.gameserver.clientpackets;

import l2p.gameserver.instancemanager.PrimeShopManager;
import l2p.gameserver.model.L2Player;

public class RequestBR_ProductInfo extends L2GameClientPacket {
private int iProductID;

public void readImpl() {
iProductID = readD();
}

public void runImpl() {
L2Player player = getClient().getActiveChar();

if (player == null)
return;
else
PrimeShopManager.getInstance().showItemInfo(player, iProductID);
}
}

5)l2p\gameserver\clientpackets\RequestBR_ProductList.java
package l2p.gameserver.clientpackets;

import l2p.gameserver.instancemanager.PrimeShopManager;
import l2p.gameserver.model.L2Player;

public class RequestBR_ProductList extends L2GameClientPacket {
@Override
public void readImpl() {
}

@Override
public void runImpl() {
L2Player player = getClient().getActiveChar();

if (player == null)
return;
else
PrimeShopManager.getInstance().showList(player);
}
}

6)l2p\gameserver\clientpackets\RequestBR_ProductList.java
package l2p.gameserver.clientpackets;

import l2p.gameserver.instancemanager.PrimeShopManager;
import l2p.gameserver.model.L2Player;


public class RequestBR_RecentProductList extends L2GameClientPacket {
public void readImpl() {

}

public void runImpl() {
L2Player player = getClient().getActiveChar();
if (player == null)
return;
PrimeShopManager.getInstance().recentProductList(player);
}
}


Переходим к сервер сайд пакетам

Опкоды для Епилога Спасибо Висталлу за то что указал на хронику.

ExBR_BuyProduct
writeEx(0xCC);
ExBR_GamePoint
writeEx(0xB8);
ExBR_ProductInfo
writeEx(0xCB);
ExBR_ProductList
writeEx(0xCA);
ExBR_RecentProductList
writeEx(0xD1);


7)l2p\gameserver\serverpackets\ExBR_ProductInfo.java
package l2p.gameserver.serverpackets;

import l2p.gameserver.instancemanager.PrimeShopManager.ItemMallItem;

public class ExBR_ProductInfo extends L2GameServerPacket {
private ItemMallItem _item;

public ExBR_ProductInfo(ItemMallItem item) {
_item = item;
}

@Override
protected void writeImpl() {
writeC(0xFE);
writeH(0xCB);

writeD(_item.template.brId);
writeD(_item.price);
writeD(1);
writeD(_item.template.itemId);
writeD(_item.count);
writeD(_item.iWeight);
writeD(_item.iDropable ? 1 : 0);
}
}



8)l2p\gameserver\serverpackets\ExBR_ProductList.java
package l2p.gameserver.serverpackets;

import l2p.Config;
import l2p.gameserver.instancemanager.PrimeShopManager.ItemMallItem;

import java.util.Collection;

public class ExBR_ProductList extends L2GameServerPacket {
public Collection<ItemMallItem> col;

@Override
protected void writeImpl() {
writeC(EXTENDED_PACKET);
writeH(0xCA);
writeD(col.size());

for (ItemMallItem cs : col) {
writeD(cs.template.brId);
writeH(cs.template.category);
writeD(cs.price);
int cat = 0;
if (cs.iSale >= Config.colUp) {
switch (cs.iCategory2) {
case 0:
case 2:
cat = 2;
break;
case 1:
cat = 3;
break;
}
}
writeD(cat);
if (cs.iStartSale > 0 && cs.iEndSale > 0) {
writeD(cs.iStartSale);
writeD(cs.iEndSale);
} else {
writeD(0x12CEDE40);
writeD(0x7ECE3CD0);
}
writeC(0x7F);
writeC(cs.iStartHour);
writeC(cs.iStartMin);
writeC(cs.iEndHour);
writeC(cs.iEndMin);
writeD(cs.iStock);
writeD(cs.iMaxStock);
}

}
}

8) l2p\gameserver\serverpackets\ExBR_RecentProductListPacket.java
package l2p.gameserver.serverpackets;

import l2p.gameserver.instancemanager.PrimeShopManager;

import java.util.List;


public class ExBR_RecentProductListPacket extends L2GameServerPacket {
List<PrimeShopManager.ItemMallItem> list;

public ExBR_RecentProductListPacket(int objId) {
list = PrimeShopManager.getInstance().getRecentListByOID(objId);
}

@Override
protected void writeImpl() {
writeC(0xFE);
writeH(0xD1);
writeD(list.size());
for (PrimeShopManager.ItemMallItem item : list) {
writeD(item.template.brId);
writeH(item.template.category);
writeD(item.price);
int cat = 0;
if (item.iSale >= 2) {
switch (item.iCategory2) {
case 0:
case 2:
cat = 2;
break;
case 1:
cat = 3;
break;
}
}
writeD(cat);
if (item.iStartSale > 0 && item.iEndSale > 0) {
writeD(item.iStartSale);
writeD(item.iEndSale);
} else {
writeD(0x12CEDE40);
writeD(0x7ECE3CD0);
}
writeC(0x7F);
writeC(item.iStartHour);
writeC(item.iStartMin);
writeC(item.iEndHour);
writeC(item.iEndMin);
writeD(item.iStock);
writeD(item.iMaxStock);
}
}
}


9) l2p\gameserver\serverpackets\ExBR_BuyProductResult.java

package l2p.gameserver.serverpackets;

public class ExBR_BuyProductResult extends L2GameServerPacket {
private int _code;

public ExBR_BuyProductResult(int code) {
_code = code;
}

@Override
protected void writeImpl() {
writeC(0xFE);
writeH(0xCC);
writeD(_code);
}
}




10)Утила сорта l2p\util\ValueSortMap.java
package l2p.util;


import java.util.*;

/**
* This class is used to show how you can sort a java.uti.Map for values. This also
* takes care of null and duplicate values present in the map.
*/
@SuppressWarnings("unchecked")
public class ValueSortMap
{
public Map<Integer, Integer> sortThis(Map<Integer, Integer> map, boolean asc)
{
return sortMapByValue(map, asc);
}

/**
* This method returns the new LinkedHashMap sorted with values for passed Comparater.
* If null values exist they will be put in the last of the returned LinkedHashMap.
* If there are duplicate values they will come together at the values ordering order
* but ordering between same multiple values is ramdom. Passed Map will be intect.
* @param inMap Map to be sorted
* @param comparator Values will be sorted as per passed Comparater
* @return LinkedHashMap Sorted new LinkedHashMap
*/
public static LinkedHashMap sortMapByValue(Map inMap, Comparator comparator)
{
return sortMapByValue(inMap, comparator, null);
}

/**
* This method returns the new LinkedHashMap sorted with values for passed ascendingOrder.
* If null values exist they will be put in the last for true value of ascendingOrder or
* will be put on top of the returned LinkedHashMap for false value of ascendingOrder.
* If there are duplicate values they will come together at the values ordering order
* but ordering between same multiple values is ramdom. Passed Map will be intect.
* @param inMap Map to be sorted
* @param ascendingOrder Values will be sorted as per value of ascendingOrder
* @return LinkedHashMap Sorted new LinkedHashMap
*/
public static LinkedHashMap sortMapByValue(Map inMap, boolean ascendingOrder)
{
return sortMapByValue(inMap, null, new Boolean(ascendingOrder));
}

/**
* This method returns the new LinkedHashMap sorted with values in ascending order.
* If null values exist they will be put in the last of the returned LinkedHashMap.
* If there are duplicate values they will come together at the values ordering order
* but ordering between same multiple values is ramdom. Passed Map will be intect.
* @param inMap Map to be sorted
* @return LinkedHashMap Sorted new LinkedHashMap
*/
public static LinkedHashMap sortMapByValue(Map inMap)
{
return sortMapByValue(inMap, null, null);
}

/**
* This method returns the new LinkedHashMap sorted with values. Values will be sorted
* as value of passed comparator if ascendingOrder is null or in order of passed
* ascendingOrder if it is not null.
* If null values exist they will be put in the last for true value of ascendingOrder or
* will be put on top of the returned LinkedHashMap for false value of ascendingOrder.
* If there are duplicate values they will come together at the values ordering order
* but ordering between same multiple values is ramdom. Passed Map will be intect.
* @param inMap Map to be sorted
* @param comparator Values will be sorted as per passed Comparater
* @param ascendingOrder Values will be sorted as per value of ascendingOrder
* @return LinkedHashMap Sorted new LinkedHashMap
*/
private static LinkedHashMap sortMapByValue(Map inMap, Comparator comparator, Boolean ascendingOrder)
{
int iSize = inMap.size();

// Create new LinkedHashMap that need to be returned
LinkedHashMap sortedMap = new LinkedHashMap(iSize);

Collection values = inMap.values();
ArrayList valueList = new ArrayList(values); // To get List of all values in passed Map
HashSet distinctValues = new HashSet(values); // To know the distinct values in passed Map

// Do handing for null values. remove them from the list that will be used for sorting
int iNullValueCount = 0; // Total number of null values present in passed Map
if(distinctValues.contains(null))
{
distinctValues.remove(null);
for(int i = 0; i < valueList.size(); i++)
{
if(valueList.get(i) == null)
{
valueList.remove(i);
iNullValueCount++;
i--;
continue;
}
}
}

// Sort the values of the passed Map
if(ascendingOrder == null)
{
// If Boolean ascendingOrder is null, use passed comparator for order of sorting values
Collections.sort(valueList, comparator);
}
else if(ascendingOrder.booleanValue())
{
// If Boolean ascendingOrder is not null and is true, sort values in ascending order
Collections.sort(valueList);
}
else
{
// If Boolean ascendingOrder is not null and is false, sort values in descending order
Collections.sort(valueList);
Collections.reverse(valueList);
}

// Check if there are multiple same values exist in passed Map (not considering null values)
boolean bAllDistinct = true;
if(iSize != (distinctValues.size() + iNullValueCount))
bAllDistinct = false;

Object key = null, value = null, sortedValue;
Set keySet = null;
Iterator itKeyList = null;
HashMap hmTmpMap = new HashMap(iSize);
HashMap hmNullValueMap = new HashMap();

if(bAllDistinct)
{
// There are no multiple same values in the passed map (without consedring null)
keySet = inMap.keySet();
itKeyList = keySet.iterator();
while(itKeyList.hasNext())
{
key = itKeyList.next();
value = inMap.get(key);

if(value != null)
hmTmpMap.put(value, key); // Prepare new temp HashMap with value=key combination
else
hmNullValueMap.put(key, value); // Keep all null values in a new temp Map
}

if(ascendingOrder != null && !ascendingOrder.booleanValue())
{
// As it is descending order, Add Null Values in first place of the LinkedHasMap
sortedMap.putAll(hmNullValueMap);
}

// Put all not null values in returning LinkedHashMap
for(int i = 0; i < valueList.size(); i++)
{
value = valueList.get(i);
key = hmTmpMap.get(value);

sortedMap.put(key, value);
}

if(ascendingOrder == null || ascendingOrder.booleanValue())
{
// Add Null Values in the last of the LinkedHasMap
sortedMap.putAll(hmNullValueMap);
}
}
else
{
// There are some multiple values (with out considering null)
keySet = inMap.keySet();
itKeyList = keySet.iterator();
while(itKeyList.hasNext())
{
key = itKeyList.next();
value = inMap.get(key);

if(value != null)
hmTmpMap.put(key, value); // Prepare new temp HashMap with key=value combination
else
hmNullValueMap.put(key, value); // Keep all null values in a new temp Map
}

if(ascendingOrder != null && !ascendingOrder.booleanValue())
{
// As it is descending order, Add Null Values in first place of the LinkedHasMap
sortedMap.putAll(hmNullValueMap);
}

// Put all not null values in returning LinkedHashMap
for(int i = 0; i < valueList.size(); i++)
{
sortedValue = valueList.get(i);

// Search this value in temp HashMap and if found remove it
keySet = hmTmpMap.keySet();
itKeyList = keySet.iterator();
while(itKeyList.hasNext())
{
key = itKeyList.next();
value = hmTmpMap.get(key);
if(value.equals(sortedValue))
{
sortedMap.put(key, value);
hmTmpMap.remove(key);
break;
}
}
}

if(ascendingOrder == null || ascendingOrder.booleanValue())
{
// Add Null Values in the last of the LinkedHasMap
sortedMap.putAll(hmNullValueMap);
}
}

return sortedMap;
}
}


12)Переходим к стадии регистрации пакетов.
Все остальные введены в феникс не позднее 13к+ ревы
case 0x7f:
msg = new RequestBR_GamePoint();
break;
case 0x80:
msg = new RequestBR_ProductList();
break;
case 0x81:
msg = new RequestBR_ProductInfo();
break;
case 0x82:
msg = new RequestBR_BuyProduct();
break;
case 0x83:
msg = new RequestBR_RecentProductList();
break;


13)2p\Config.java
public static int colUp; // item mall
colUp = getIntProperty(servicesSettings, "IMup", 2);



Переходим к части датапака и собственно самой простой

14)l2p\gameserver\data\prime_shop.xml

<?xml version='1.0' encoding='utf-8'?>
<list>
<item brId="1080001" itemId="22000" name="Small fortuna box" category="5" />
<item brId="1080002" itemId="22001" name="Middle fortuna box" category="5" />
<item brId="1080003" itemId="22002" name="Large fortuna box" category="5" />
<item brId="1080004" itemId="22003" name="Small fortuna cube" category="5" />
<item brId="1080005" itemId="22004" name="Middle fortuna cube" category="5" />
<item brId="1080006" itemId="22005" name="Large fortuna cube" category="5" />
<item brId="1080007" itemId="22025" name="Powerful Healing Potion" category="5" />
<item brId="1080008" itemId="22026" name="High-grade Healing Potion" category="5" />
</list>

15) Sql часть

-- ----------------------------
-- Table structure for prime_shop
-- ----------------------------
DROP TABLE IF EXISTS `prime_shop`;
CREATE TABLE `prime_shop` (
`ord` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`itemId` int(11) NOT NULL,
`count` int(11) NOT NULL DEFAULT '1',
`price` int(11) NOT NULL DEFAULT '0',
`iCategory2` int(1) NOT NULL DEFAULT '0',
`onSale` int(1) NOT NULL DEFAULT '1',
`iStartSale` int(9) NOT NULL DEFAULT '0',
`iEndSale` int(9) NOT NULL DEFAULT '0',
`iStartHour` int(2) NOT NULL DEFAULT '0',
`iStartMin` int(2) NOT NULL DEFAULT '0',
`iEndHour` int(2) NOT NULL DEFAULT '23',
`iEndMin` int(2) NOT NULL DEFAULT '59',
`iStock` int(11) NOT NULL DEFAULT '0',
`iMaxStock` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ord`,`itemId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `prime_shop` VALUES
('1', 'Small fortuna box', '22000', '1', '135', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('2', 'Middle fortuna box', '22001', '1', '270', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('3', 'Large fortuna box', '22002', '1', '405', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('4', 'small fortuna cube', '22003', '1', '81', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('5', 'Middle fortuna cube', '22004', '1', '216', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('6', 'Large fortuna cube', '22005', '1', '324', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('7', 'Powerful Healing Potion', '22025', '1', '3', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('8', 'Rune of Feather', '22066', '1', '68', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0'),
('9', 'High-grade Healing Potion', '22026', '1', '1', '0', '1', '0', '0', '0', '0', '23', '59', '0', '0');



Теперь НЕ ЗАБУДЬТЕ ВКЛЮЧИТЬ ЕГО В КЛИЕНТЕ !
Будет работать как на евро клиенте так и на руссоффе.
Lineage2/system/l2.ini открываем и вставляем. ->

[PrimeShop]
UsePrimeShop=true




Вот вам и айтем мол и с чем его едят :pandaredlol: Больше только разговоров ....... уже даже и америкосы ( кхе хе ... пендосы) подтянусь ЫЫЫ вистал попыривал своими партизанскими штуками аля ойй епрррр я свой код не шарю XD

PS
Вуаля ! У Вас на сервере есть Item Mall !

Добавлено через 47 минут
SunnyX Написал:Самый главный вопрос который нужно было разместить на первом посте - с каких хроник эта плюшка доступна.

от Chaotic Throne 2.

Добавлено через 1 час 3 минуты
saYRam Написал:Also Official L2jServer? If so, what do i have to do?

look for a good programmer , when the Slavs will to enslave the worlds Big Grin

PSS Юзайте на здоровье.Все работает качественно.
Ответ
#84
Deazer Написал:Реализация взято из l2f и переделано ,им собственно и спасибо , для себя делал тоже отталкиваясь от их кода - не копипастил !

а для каких хроник, что-то не вижу?
Ответ
#85
ни пакета не менялось премиум шопа от СT2 и до Freya вистал сан.
Тестил на Freya/Epilogue
Заказчику делал для Epilogue в реализации фениксов
Себе делал на Фрея - НЕ на феникс основе.
Программос подсказал что премиум шоп и в ИЛ есть , но как там дела обстоят с клиент пакет и сервер пакет без понятия , но думаю что и там так же все работает.
Ответ
#86
Deazer Написал:ни пакета не менялось премиум шопа от СT2 и до Freya вистал сан.
Тестил на Freya/Epilogue
Заказчику делал для Epilogue в реализации фениксов
Себе делал на Фрея - НЕ на феникс основе.
Программос подсказал что премиум шоп и в ИЛ есть , но как там дела обстоят с клиент пакет и сервер пакет без понятия , но думаю что и там так же все работает.

не совсем верно.Wink

В грации 1/2 не было "Последнии покупаемые товары" + пакетка была проще.

А вообще в каждых тронах до анниверсари, меняются опкоды пакетов, поэтому уточняй)
Ответ
#87
Там не полностью меняются. Просто корейцы добавляют в середину списка, а не в конец. Для фреи разница фактически в

PHP код:
<?php 
FE
:B8 ExCloseRaidSocket
FE
:B9 ExPrivateMarketListPacket
FE
:BA ExRaidCharacterSelected
FE
:BB ExAskCoupleAction
FE
:BC ExBR_LoadEventTopRankersPacket
FE
:BD ExChangeNPCState
FE
:BE ExAskModifyPartyLooting
FE
:BF ExSetPartyLooting
FE
:C0 ExRotation
FE
:C1 ExChangeZoneInof
FE
:C2 ExMembershipInfo
FE
:C3 ExReplyHandOverPartyMaster
FE
:C4 ExQuestNpcLogList
FE
:C5 ExQuestItemListPacket
FE
:C6 ExGMViewQuestItemListPacket
FE
:C7 ExResartResponse
FE
:C8 ExVoteSystemInfoPacket
FE
:C9 ExBR_GamePointPacket
FE
:CA ExBR_ProductListPacket d[dhddddcccccdd]
FE:CB ExBR_ProductInfoPacket ddd[dddd]
FE:CC ExBR_BuyProductPacket
FE
:CD ExBR_PremiumStatePacket
FE
:CE ExBrBroadcastEventState
FE
:CF ExBrExtraUserInfo
FE
:D0 ExBrBuffEventState
FE
:D1 ExBR_RecentProductListPacket
FE
:D2 ExBR_MinigameLoadScoresPacket
FE
:D3 ExBR_AgathionEnergyInfoPacket

Вот тока не понимаю, зачем в клиенте обработка пакета на инфо итема (FE:CB ExBR_ProductInfoPacket ddd[dddd]) идёт в цикле. Мб можно и по 2 итема в инфо засовыватЬ?
Ответ
#88
видимо свойства как они в эпилоге делали

энчанты, спешал эффекты,хотя если исходить из ассортимента могу также предположить отобращение того что распаковывается,экперементируй
Ответ
#89
Есть патчик, я его немного подправил, и скомпилил сборку, магазин работает и все отлично, но как только я нажимаю на любой товар я получаю ошибку следующего содержания:

Код:
Client: [Character: Mita[268482712] - Account: mitara - IP: 192.168.0.1] - Failed writing: [S] FE:CB ExBrProductInfo - L2J Server Version: 4479 - DP Revision: 7750 ; null java.lang.NullPointerException
        at com.l2jserver.gameserver.network.serverpackets.ExBrProductInfo.writeImpl(ExBrProductInfo.java:32)
        at com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket.write(L2GameServerPacket.java:63)
        at org.mmocore.network.SelectorThread.putPacketIntoWriteBuffer(SelectorThread.java:576)
        at org.mmocore.network.SelectorThread.prepareWriteBuffer(SelectorThread.java:548)
        at org.mmocore.network.SelectorThread.writePacket(SelectorThread.java:467)
        at org.mmocore.network.SelectorThread.run(SelectorThread.java:179)

Сборка l2jserver
Ядро - 4486 ревизия
Датапак - 7756 ревизия
Ответ
#90
не могу понять вещь... хочу в ИМ добавить допустим cat ear (прописываю в item-list.xml и item-list.sql). Естественно в ИМ он пока не отображается, добавляю предмет в productname.dat таким способом:
1100361 Cat Ear br_cashtex.item.br_cash_wrapped_accessary_i00
при сохранении эта строка теряется, естественно и в клиенте - нет.
может че-то не так делаю?
patheditor 1.4.0.0
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  CommunityBoard + GM Shop реализация michail_ST 5 1,681 04-21-2016, 01:20 PM
Последний пост: flopix
  Что такое пакет Numeric 8 1,850 07-01-2014, 05:47 PM
Последний пост: Daan Raven
  Donate Shop [Lucera] labrador116 23 10,867 03-12-2014, 03:08 PM
Последний пост: labrador116
  Item Auction KilRoy 8 3,261 01-05-2014, 04:20 PM
Последний пост: Ashe
  Как рисовать такое? Raymon212 8 3,157 11-10-2013, 10:30 PM
Последний пост: MrShyr
  Beauty Shop Gaikotsu 17 5,201 09-19-2013, 09:13 PM
Последний пост: Daan Raven
  Drop Item Сантехник 5 1,513 08-30-2013, 10:41 PM
Последний пост: SoniPro
  Что такое АИ? Drag0N 6 1,532 07-14-2013, 01:47 PM
Последний пост: Zubastic
  Item Landver 10 2,323 04-05-2013, 10:36 PM
Последний пост: xolseg
  Item Broker в (Lineage 2 High Five) Adkot 2 2,031 03-14-2013, 10:12 AM
Последний пост: Adkot

Перейти к форуму:


Пользователи, просматривающие эту тему: 3 Гость(ей)