Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
UpdatePrice()
#1
Куда можно поставить обновление, чтобы оно менялось при снятии/одевании шмотки?
Сделал вот такую штуку, все прекрасно работает, поставил обновление в EnterWorld, но надо чтобы все обновлялось при изменение шмота:
[SRC="java"] public void updatePrice()
{
int temp = 9;

ItemInstance weapon = getActiveWeaponInstance();
if (weapon != null)
{
switch (weapon.getCrystalType().externalOrdinal)
{
case 5: // S grade
if (weapon.getEnchantLevel() > 3)
{
temp += 8;
}
else
{
temp += 6;
}
break;

case 4: // A grade
if (weapon.getEnchantLevel() > 3)
{
temp += 7;
}
else
{
temp += 5;
}
break;

case 3: // B grade
if (weapon.getEnchantLevel() > 3)
{
temp += 6;
}
else
{
temp += 4;
}
break;
}
}

Inventory i = getInventory();


List<ItemInstance> armor = new ArrayList<ItemInstance>();
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_HEAD));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_CHEST));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_GLOVES));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_FEET));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_LEGS));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_NECK));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_REAR));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_LEAR));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_RFINGER));
armor.add(i.getPaperdollItem(Inventory.PAPERDOLL_LFINGER));

int avg_enchant = 0, avg_grade = 0, count = 0;


for (ItemInstance item : armor)
{
if (item == null)
{
continue;
}

count++;

avg_enchant += item.getEnchantLevel();
avg_grade += item.getCrystalType().externalOrdinal;
}

if (count > 0)
{
avg_enchant = Math.round(avg_enchant / count);

if (avg_enchant >= 6)
{
temp += 8;
}
else if (avg_enchant >= 3)
{
temp += 3;
}

avg_grade = Math.round(avg_grade / count);

switch (avg_grade)
{
case 5: // S grade
temp += 6;
break;
case 4: // A grade
temp += 5;
break;
case 3: // B grade
temp += 4;
break;
}
}

if (isHero())
{
temp += 25;
}

if (getPvpKills() >= 100)
{
temp += 15;
}


_price = temp;

broadcastUserInfo(false);
broadcastCharInfo();
}[/SRC]
Подскажите пожалуйста куда можно поставить апдейт?
Ответ
#2
в слушатель, наследник OnEquipListener, ну например в ItemSkillsListener
или отдельный слушатель, наследник OnEquipListener опять же написать и зарегать по аналогии с существующими в классе PcInventory.
Ответ
#3
Сделал такой:
[SRC="java"]package l2p.gameserver.listener.inventory;

import l2p.gameserver.listener.inventory.OnEquipListener;
import l2p.gameserver.model.Playable;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.Inventory;
import l2p.gameserver.model.items.ItemInstance;

public class PriceUpdateListener implements OnEquipListener
{
private static PriceUpdateListener inst = new PriceUpdateListener();

Player _owner;

public static PriceUpdateListener getInstance()
{
return inst;
}

@Override
public void onEquip(int slot, ItemInstance item, Playable actor)
{
if(actor.getPlayer() == null)
return;

switch (slot)
{
case Inventory.PAPERDOLL_RHAND:
case Inventory.PAPERDOLL_HEAD:
case Inventory.PAPERDOLL_CHEST:
case Inventory.PAPERDOLL_GLOVES:
case Inventory.PAPERDOLL_FEET:
case Inventory.PAPERDOLL_LEGS:
case Inventory.PAPERDOLL_NECK:
case Inventory.PAPERDOLL_REAR:
case Inventory.PAPERDOLL_LEAR:
case Inventory.PAPERDOLL_RFINGER:
case Inventory.PAPERDOLL_LFINGER:

actor.getPlayer().updatePrice();
_owner.updatePrice();
break;

}
}

@Override
public void onUnequip(int slot, ItemInstance item, Playable actor)
{
if(actor.getPlayer() == null)
return;

switch (slot)
{
case Inventory.PAPERDOLL_RHAND:
case Inventory.PAPERDOLL_HEAD:
case Inventory.PAPERDOLL_CHEST:
case Inventory.PAPERDOLL_GLOVES:
case Inventory.PAPERDOLL_FEET:
case Inventory.PAPERDOLL_LEGS:
case Inventory.PAPERDOLL_NECK:
case Inventory.PAPERDOLL_REAR:
case Inventory.PAPERDOLL_LEAR:
case Inventory.PAPERDOLL_RFINGER:
case Inventory.PAPERDOLL_LFINGER:

actor.getPlayer().updatePrice();
_owner.updatePrice();
break;

}
}
}
[/SRC]
Но все равно не обновляется, в чем ошибка?

Добавлено через 34 минуты
Упс, простите меня невнимательного Sad
Надо было одну строчку добавить в pcInventory.
Ответ
#4
L2J Написал:Сделал такой:
[SRC="java"]package l2p.gameserver.listener.inventory;

import l2p.gameserver.listener.inventory.OnEquipListener;
import l2p.gameserver.model.Playable;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.items.Inventory;
import l2p.gameserver.model.items.ItemInstance;

public class PriceUpdateListener implements OnEquipListener
{
private static PriceUpdateListener inst = new PriceUpdateListener();

Player _owner;

public static PriceUpdateListener getInstance()
{
return inst;
}

@Override
public void onEquip(int slot, ItemInstance item, Playable actor)
{
if(actor.getPlayer() == null)
return;

switch (slot)
{
case Inventory.PAPERDOLL_RHAND:
case Inventory.PAPERDOLL_HEAD:
case Inventory.PAPERDOLL_CHEST:
case Inventory.PAPERDOLL_GLOVES:
case Inventory.PAPERDOLL_FEET:
case Inventory.PAPERDOLL_LEGS:
case Inventory.PAPERDOLL_NECK:
case Inventory.PAPERDOLL_REAR:
case Inventory.PAPERDOLL_LEAR:
case Inventory.PAPERDOLL_RFINGER:
case Inventory.PAPERDOLL_LFINGER:

actor.getPlayer().updatePrice();
_owner.updatePrice();
break;

}
}

@Override
public void onUnequip(int slot, ItemInstance item, Playable actor)
{
if(actor.getPlayer() == null)
return;

switch (slot)
{
case Inventory.PAPERDOLL_RHAND:
case Inventory.PAPERDOLL_HEAD:
case Inventory.PAPERDOLL_CHEST:
case Inventory.PAPERDOLL_GLOVES:
case Inventory.PAPERDOLL_FEET:
case Inventory.PAPERDOLL_LEGS:
case Inventory.PAPERDOLL_NECK:
case Inventory.PAPERDOLL_REAR:
case Inventory.PAPERDOLL_LEAR:
case Inventory.PAPERDOLL_RFINGER:
case Inventory.PAPERDOLL_LFINGER:

actor.getPlayer().updatePrice();
_owner.updatePrice();
break;

}
}
}
[/SRC]
Но все равно не обновляется, в чем ошибка?

Добавлено через 34 минуты
Упс, простите меня невнимательного Sad
Надо было одну строчку добавить в pcInventory.

Ага, присвоить его хозяину... (листенер)

Добавлено через 55 секунд
А еще лучше его добавьте в глобальный менеджер листенеров. Если я конечно правильно понял вашу цель...
Ответ
#5
[SRC="java"]public PcInventory(Player owner)
{
super(owner.getObjectId());
_owner = owner;

addListener(ItemSkillsListener.getInstance());
addListener(PriceUpdateListener.getInstance());
addListener(ItemAugmentationListener.getInstance());
addListener(ItemEnchantOptionsListener.getInstance());
addListener(ArmorSetListener.getInstance());
addListener(BowListener.getInstance());
addListener(AccessoryListener.getInstance());
}[/SRC]
Спасибо, я добавил сюда его и все работает.
Ответ
#6
//del
Придумал способ, но он длинноват Big Grin
Ответ


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


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