Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.serverpackets.limitshop;
import java.util.Collection;
import org.l2jmobius.commons.network.WritableBuffer;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.ServerPackets;
import org.l2jmobius.gameserver.network.serverpackets.ServerPacket;
/**
* @author Mobius
*/
public class ExPurchaseLimitShopItemListNew extends ServerPacket
{
private final Player _player;
private final int _shopType; // 3 Lcoin Store, 4 Special Craft, 100 Clan Shop
private final int _page;
private final int _totalPages;
private final Collection<LimitShopProductHolder> _products;
public ExPurchaseLimitShopItemListNew(Player player, int shopType, int page, int totalPages, Collection<LimitShopProductHolder> products)
{
_player = player;
_shopType = shopType;
_page = page;
_totalPages = totalPages;
_products = products;
}
@Override
public void writeImpl(GameClient client, WritableBuffer buffer)
{
ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_LIST_NEW.writeId(this, buffer);
buffer.writeByte(_shopType);
buffer.writeByte(_page); // 311
buffer.writeByte(_totalPages); // 311
buffer.writeInt(_products.size());
for (LimitShopProductHolder product : _products)
{
buffer.writeInt(product.getId());
buffer.writeInt(product.getProductionId());
buffer.writeInt(product.getIngredientIds()[0]);
buffer.writeInt(product.getIngredientIds()[1]);
buffer.writeInt(product.getIngredientIds()[2]);
buffer.writeInt(product.getIngredientIds()[3]); // 306
buffer.writeInt(product.getIngredientIds()[4]); // 306
buffer.writeLong(product.getIngredientQuantities()[0]);
buffer.writeLong(product.getIngredientQuantities()[1]);
buffer.writeLong(product.getIngredientQuantities()[2]);
buffer.writeLong(product.getIngredientQuantities()[3]); // 306
buffer.writeLong(product.getIngredientQuantities()[4]); // 306
buffer.writeShort(product.getIngredientEnchants()[0]);
buffer.writeShort(product.getIngredientEnchants()[1]);
buffer.writeShort(product.getIngredientEnchants()[2]);
buffer.writeShort(product.getIngredientEnchants()[3]); // 306
buffer.writeShort(product.getIngredientEnchants()[4]); // 306
// Check limits.
if (product.getAccountDailyLimit() > 0) // Sale period.
{
if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0) >= product.getAccountDailyLimit())
{
buffer.writeInt(0);
}
else
{
buffer.writeInt(product.getAccountDailyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0));
}
}
else if (product.getAccountWeeklyLimit() > 0)
{
if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0) >= product.getAccountWeeklyLimit())
{
buffer.writeInt(0);
}
else
{
buffer.writeInt(product.getAccountWeeklyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0));
}
}
else if (product.getAccountMonthlyLimit() > 0)
{
if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0) >= product.getAccountMonthlyLimit())
{
buffer.writeInt(0);
}
else
{
buffer.writeInt(product.getAccountMonthlyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0));
}
}
else if (product.getAccountBuyLimit() > 0) // Count limit.
{
if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0) >= product.getAccountBuyLimit())
{
buffer.writeInt(0);
}
else
{
buffer.writeInt(product.getAccountBuyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0));
}
}
else // No account limits.
{
buffer.writeInt(1);
}
buffer.writeInt(0); // nRemainSec
buffer.writeInt(0); // nRemainServerItemAmount
buffer.writeShort(0); // sCircleNum (311)
// Chances (474).
final float chance1 = product.getChance();
final float chance2value = product.getChance2();
final float chance3value = product.getChance3();
final float chance4value = product.getChance4();
final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value;
final float sum2 = chance1 + chance2;
final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value;
final float sum3 = sum2 + chance3;
final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value;
final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f;
buffer.writeInt((int) (chance1 * 100000));
buffer.writeInt((int) (chance2 * 100000));
buffer.writeInt((int) (chance3 * 100000));
buffer.writeInt((int) (chance4 * 100000));
buffer.writeInt((int) (chance5 * 100000));
buffer.writeInt(0); // nStartTime (464)
}
}
}
// Chances (474).
final float chance1 = product.getChance();
final float chance2value = product.getChance2();
final float chance3value = product.getChance3();
final float chance4value = product.getChance4();
final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value;
final float sum2 = chance1 + chance2;
final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value;
final float sum3 = sum2 + chance3;
final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value;
final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f;
buffer.writeInt((int) (chance1 * 100000));
buffer.writeInt((int) (chance2 * 100000));
buffer.writeInt((int) (chance3 * 100000));
buffer.writeInt((int) (chance4 * 100000));
buffer.writeInt((int) (chance5 * 100000));
поправил, спасибо большое !У самого мобиуса сделано так:
ExPurchaseLimitShopItemListNew.java
Код:/* * This file is part of the L2J Mobius project. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; import java.util.Collection; import org.l2jmobius.commons.network.WritableBuffer; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; /** * @author Mobius */ public class ExPurchaseLimitShopItemListNew extends ServerPacket { private final Player _player; private final int _shopType; // 3 Lcoin Store, 4 Special Craft, 100 Clan Shop private final int _page; private final int _totalPages; private final Collection<LimitShopProductHolder> _products; public ExPurchaseLimitShopItemListNew(Player player, int shopType, int page, int totalPages, Collection<LimitShopProductHolder> products) { _player = player; _shopType = shopType; _page = page; _totalPages = totalPages; _products = products; } @Override public void writeImpl(GameClient client, WritableBuffer buffer) { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_LIST_NEW.writeId(this, buffer); buffer.writeByte(_shopType); buffer.writeByte(_page); // 311 buffer.writeByte(_totalPages); // 311 buffer.writeInt(_products.size()); for (LimitShopProductHolder product : _products) { buffer.writeInt(product.getId()); buffer.writeInt(product.getProductionId()); buffer.writeInt(product.getIngredientIds()[0]); buffer.writeInt(product.getIngredientIds()[1]); buffer.writeInt(product.getIngredientIds()[2]); buffer.writeInt(product.getIngredientIds()[3]); // 306 buffer.writeInt(product.getIngredientIds()[4]); // 306 buffer.writeLong(product.getIngredientQuantities()[0]); buffer.writeLong(product.getIngredientQuantities()[1]); buffer.writeLong(product.getIngredientQuantities()[2]); buffer.writeLong(product.getIngredientQuantities()[3]); // 306 buffer.writeLong(product.getIngredientQuantities()[4]); // 306 buffer.writeShort(product.getIngredientEnchants()[0]); buffer.writeShort(product.getIngredientEnchants()[1]); buffer.writeShort(product.getIngredientEnchants()[2]); buffer.writeShort(product.getIngredientEnchants()[3]); // 306 buffer.writeShort(product.getIngredientEnchants()[4]); // 306 // Check limits. if (product.getAccountDailyLimit() > 0) // Sale period. { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0) >= product.getAccountDailyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountDailyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountWeeklyLimit() > 0) { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0) >= product.getAccountWeeklyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountWeeklyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountMonthlyLimit() > 0) { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0) >= product.getAccountMonthlyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountMonthlyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountBuyLimit() > 0) // Count limit. { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0) >= product.getAccountBuyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountBuyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0)); } } else // No account limits. { buffer.writeInt(1); } buffer.writeInt(0); // nRemainSec buffer.writeInt(0); // nRemainServerItemAmount buffer.writeShort(0); // sCircleNum (311) // Chances (474). final float chance1 = product.getChance(); final float chance2value = product.getChance2(); final float chance3value = product.getChance3(); final float chance4value = product.getChance4(); final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value; final float sum2 = chance1 + chance2; final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value; final float sum3 = sum2 + chance3; final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value; final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f; buffer.writeInt((int) (chance1 * 100000)); buffer.writeInt((int) (chance2 * 100000)); buffer.writeInt((int) (chance3 * 100000)); buffer.writeInt((int) (chance4 * 100000)); buffer.writeInt((int) (chance5 * 100000)); buffer.writeInt(0); // nStartTime (464) } } }
Это и есть шансы, которые берутся из LimitShopCraft.xml
Код:// Chances (474). final float chance1 = product.getChance(); final float chance2value = product.getChance2(); final float chance3value = product.getChance3(); final float chance4value = product.getChance4(); final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value; final float sum2 = chance1 + chance2; final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value; final float sum3 = sum2 + chance3; final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value; final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f; buffer.writeInt((int) (chance1 * 100000)); buffer.writeInt((int) (chance2 * 100000)); buffer.writeInt((int) (chance3 * 100000)); buffer.writeInt((int) (chance4 * 100000)); buffer.writeInt((int) (chance5 * 100000));
ну у меня по хуже...У самого мобиуса сделано так:
ExPurchaseLimitShopItemListNew.java
Код:/* * This file is part of the L2J Mobius project. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.l2jmobius.gameserver.network.serverpackets.limitshop; import java.util.Collection; import org.l2jmobius.commons.network.WritableBuffer; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.holders.LimitShopProductHolder; import org.l2jmobius.gameserver.model.variables.AccountVariables; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.ServerPackets; import org.l2jmobius.gameserver.network.serverpackets.ServerPacket; /** * @author Mobius */ public class ExPurchaseLimitShopItemListNew extends ServerPacket { private final Player _player; private final int _shopType; // 3 Lcoin Store, 4 Special Craft, 100 Clan Shop private final int _page; private final int _totalPages; private final Collection<LimitShopProductHolder> _products; public ExPurchaseLimitShopItemListNew(Player player, int shopType, int page, int totalPages, Collection<LimitShopProductHolder> products) { _player = player; _shopType = shopType; _page = page; _totalPages = totalPages; _products = products; } @Override public void writeImpl(GameClient client, WritableBuffer buffer) { ServerPackets.EX_PURCHASE_LIMIT_SHOP_ITEM_LIST_NEW.writeId(this, buffer); buffer.writeByte(_shopType); buffer.writeByte(_page); // 311 buffer.writeByte(_totalPages); // 311 buffer.writeInt(_products.size()); for (LimitShopProductHolder product : _products) { buffer.writeInt(product.getId()); buffer.writeInt(product.getProductionId()); buffer.writeInt(product.getIngredientIds()[0]); buffer.writeInt(product.getIngredientIds()[1]); buffer.writeInt(product.getIngredientIds()[2]); buffer.writeInt(product.getIngredientIds()[3]); // 306 buffer.writeInt(product.getIngredientIds()[4]); // 306 buffer.writeLong(product.getIngredientQuantities()[0]); buffer.writeLong(product.getIngredientQuantities()[1]); buffer.writeLong(product.getIngredientQuantities()[2]); buffer.writeLong(product.getIngredientQuantities()[3]); // 306 buffer.writeLong(product.getIngredientQuantities()[4]); // 306 buffer.writeShort(product.getIngredientEnchants()[0]); buffer.writeShort(product.getIngredientEnchants()[1]); buffer.writeShort(product.getIngredientEnchants()[2]); buffer.writeShort(product.getIngredientEnchants()[3]); // 306 buffer.writeShort(product.getIngredientEnchants()[4]); // 306 // Check limits. if (product.getAccountDailyLimit() > 0) // Sale period. { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0) >= product.getAccountDailyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountDailyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_DAILY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountWeeklyLimit() > 0) { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0) >= product.getAccountWeeklyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountWeeklyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_WEEKLY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountMonthlyLimit() > 0) { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0) >= product.getAccountMonthlyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountMonthlyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_MONTHLY_COUNT + product.getProductionId(), 0)); } } else if (product.getAccountBuyLimit() > 0) // Count limit. { if (_player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0) >= product.getAccountBuyLimit()) { buffer.writeInt(0); } else { buffer.writeInt(product.getAccountBuyLimit() - _player.getAccountVariables().getInt(AccountVariables.LCOIN_SHOP_PRODUCT_COUNT + product.getProductionId(), 0)); } } else // No account limits. { buffer.writeInt(1); } buffer.writeInt(0); // nRemainSec buffer.writeInt(0); // nRemainServerItemAmount buffer.writeShort(0); // sCircleNum (311) // Chances (474). final float chance1 = product.getChance(); final float chance2value = product.getChance2(); final float chance3value = product.getChance3(); final float chance4value = product.getChance4(); final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value; final float sum2 = chance1 + chance2; final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value; final float sum3 = sum2 + chance3; final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value; final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f; buffer.writeInt((int) (chance1 * 100000)); buffer.writeInt((int) (chance2 * 100000)); buffer.writeInt((int) (chance3 * 100000)); buffer.writeInt((int) (chance4 * 100000)); buffer.writeInt((int) (chance5 * 100000)); buffer.writeInt(0); // nStartTime (464) } } }
Это и есть шансы, которые берутся из LimitShopCraft.xml
Код:// Chances (474). final float chance1 = product.getChance(); final float chance2value = product.getChance2(); final float chance3value = product.getChance3(); final float chance4value = product.getChance4(); final float chance2 = chance2value == 100f ? 100f - chance1 : chance2value; final float sum2 = chance1 + chance2; final float chance3 = chance3value == 100f ? 100f - sum2 : chance3value; final float sum3 = sum2 + chance3; final float chance4 = chance4value == 100f ? 100f - sum3 : chance4value; final float chance5 = chance4value != 100f ? 100f - (sum3 + chance4) : 0f; buffer.writeInt((int) (chance1 * 100000)); buffer.writeInt((int) (chance2 * 100000)); buffer.writeInt((int) (chance3 * 100000)); buffer.writeInt((int) (chance4 * 100000)); buffer.writeInt((int) (chance5 * 100000));
private int getChance01(LimitShopProduct product)
{
if (product.getIngredientIds()[0] > 0 && product.getChance() > 0)
{
return getChance(product.getChance());
}
else if (product.getIngredientIds()[1] > 0 && product.getChance2() > 0)
{
return getChance(product.getChance2());
}
else if (product.getIngredientIds()[2] > 0 && product.getChance3() > 0)
{
return getChance(product.getChance3());
}
else if (product.getIngredientIds()[3] > 0 && product.getChance4() > 0)
{
return getChance(product.getChance4());
}
return getLastChance(product);
}
private int getChance02(LimitShopProduct product)
{
if (product.getIngredientIds()[1] > 0 && product.getChance2() > 0)
{
return getChance(product.getChance2());
}
else if (product.getIngredientIds()[2] > 0 && product.getChance3() > 0)
{
return getChance(product.getChance3());
}
else if (product.getIngredientIds()[3] > 0 && product.getChance4() > 0)
{
return getChance(product.getChance4());
}
return getLastChance(product);
}
private int getChance03(LimitShopProduct product)
{
if (product.getIngredientIds()[2] > 0 && product.getChance3() > 0)
{
return getChance(product.getChance3());
}
else if (product.getIngredientIds()[3] > 0 && product.getChance4() > 0)
{
return getChance(product.getChance4());
}
return getLastChance(product);
}
private int getChance04(LimitShopProduct product)
{
if (product.getIngredientIds()[3] > 0 && product.getChance4() > 0)
{
return getChance(product.getChance4());
}
return getLastChance(product);
}
private int getChance05(LimitShopProduct product)
{
return getLastChance(product);
}
private int getLastChance(LimitShopProduct product)
{
return getChance(100d - (product.getChance() + product.getChance2() + product.getChance3() + product.getChance4()));
}
private int getChance(double value)
{
return (int) Math.floor(100_000d * value);
}