Сообщений: 314
Тем: 14
Зарегистрирован: Sep 2008
Репутация:
360
Исходники:
L2j based.
Что сделано:
Изменён алгоритм аугментации, бонусы, камни.
Что не получается:
Не отображается результат аугментации на шмотках. Только на оружии.
Примечание:
В логах всё ок, процесс аугментации работает отлично, статы присваиваются.
log
Augmentation success: stat12=5391; stat34=16343; resultColor=3; level=9; grade=0
Так же об успешной работе алгоритма свидетельствует заполняемая таблица item_attributes.sql
Сообщений: 32
Тем: 5
Зарегистрирован: Oct 2012
Не совсем ясна суть проблемы - вы сделали аугментацию БРОНИ? Если так, то что у вас не работает? Броня не светится (как пушка)? Такого не будет. Или у вас при выборе шмотки не пишет какие статы добавило от аугмента? Подробнее, если можно.
Сообщений: 314
Тем: 14
Зарегистрирован: Sep 2008
Репутация:
360
Да, я сделал аугментацию брони. При этом на ней в игре не отображаются добавленные статы.
Сообщений: 4,694
Тем: 85
Зарегистрирован: Mar 2009
Репутация:
23,364
Archiel Написал:Да, я сделал аугментацию брони. При этом на ней в игре не отображаются добавленные статы.
А должны?! Ведь у оружия они отображаются потому что так реализовано в клиенте. Вы клиент правили?
Fortuna - non penis, in manus non recipe.
Сообщений: 314
Тем: 14
Зарегистрирован: Sep 2008
Репутация:
360
10-23-2012, 12:57 PM
(Сообщение последний раз редактировалось: 10-23-2012, 12:58 PM Archiel.)
Ashe Написал:А должны?! Ведь у оружия они отображаются потому что так реализовано в клиенте. Вы клиент правили?
Ну есть же аугментация бижутерии, которая фактически является такой же составляющей брони, только в другом слоте.
Добавлено через 1 минуту
А в клиенте, по крайней мере в *.dat файлах, указываются только комбинации эффектов, файл optiondata_client-e.dat.
Сообщений: 32
Тем: 5
Зарегистрирован: Oct 2012
Ashe Написал:А должны?! Ведь у оружия они отображаются потому что так реализовано в клиенте. Вы клиент правили?
На овероподобных отображается аугмент брони без редактрирования клиента.
Сообщений: 314
Тем: 14
Зарегистрирован: Sep 2008
Репутация:
360
FullMetal Написал:На овероподобных отображается аугмент брони без редактрирования клиента.
А можно линк на любые шаровые исходники, где это реализовано?
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
возможно стоит покопать в серверных пакетах, отсылающих информацию о предметах клиенту - там для той же брони к примеру может значение ауги не слаться, ну точнее будет слаться ее отсутствие.
Сообщений: 314
Тем: 14
Зарегистрирован: Sep 2008
Репутация:
360
10-24-2012, 01:24 PM
(Сообщение последний раз редактировалось: 10-24-2012, 03:19 PM Archiel.)
Gaikotsu Написал:возможно стоит покопать в серверных пакетах, отсылающих информацию о предметах клиенту - там для той же брони к примеру может значение ауги не слаться, ну точнее будет слаться ее отсутствие.
Да механику я понимаю, но я там уже всё перерыл, сейчас скину куски кода, которые вообще связаны с аугментацией.
Добавлено через 15 минут
В общем сам процесс вот каков:
1) AugmentationData.java
Тут всё просто, алгоритм рассчёта аугментации, начисление бонусов и т.п.
В конце концов рассчитывается просто
Код: generateRandomAugmentation
там никаких условий связанных со шмотом нет, кроме:
1
Код: switch (bodyPart)
{
case L2Item.SLOT_LR_FINGER:
case L2Item.SLOT_LR_EAR:
case L2Item.SLOT_NECK:
return generateRandomAccessoryAugmentation(lifeStoneLevel, bodyPart);
default:
return generateRandomWeaponAugmentation(lifeStoneLevel, lifeStoneGrade);
}
Что само по себе просто меняет алгоритмы вычисления и возможные бонусы.
2) AbstractRefinePacket.java
Тут хранятся как раз условия при которых вообще можно запустить аугмент, хранятся камни, их ИД, уровни, гемы, которые используются при аугментации и т.п. Опять же, настройки влияют только на сам процесс аугментации.
3) Ну и, наконец, когда мы всё рассчитали, у нас идёт RequestRefine.java
1
Код: @Override
protected void runImpl()
{
final L2PcInstance activeChar = getClient().getActiveChar();
if (activeChar == null)
return;
L2ItemInstance targetItem = (L2ItemInstance)L2World.getInstance().findObject(_targetItemObjId);
if (targetItem == null)
return;
L2ItemInstance refinerItem = (L2ItemInstance)L2World.getInstance().findObject(_refinerItemObjId);
if (refinerItem == null)
return;
L2ItemInstance gemStoneItem = (L2ItemInstance)L2World.getInstance().findObject(_gemStoneItemObjId);
if (gemStoneItem == null)
return;
if (!isValid(activeChar, targetItem, refinerItem, gemStoneItem))
{
activeChar.sendPacket(new ExVariationResult(0,0,0));
activeChar.sendPacket(new SystemMessage(SystemMessageId.AUGMENTATION_FAILED_DUE_TO_INAPPROPRIATE_CONDITIONS));
return;
}
final LifeStone ls = getLifeStone(refinerItem.getItemId());
if (ls == null)
return;
final int lifeStoneLevel = ls.getLevel();
final int lifeStoneGrade = ls.getGrade();
if (_gemStoneCount != getGemStoneCount(targetItem.getItem().getItemGrade(), lifeStoneGrade))
{
activeChar.sendPacket(new ExVariationResult(0,0,0));
activeChar.sendPacket(new SystemMessage(SystemMessageId.AUGMENTATION_FAILED_DUE_TO_INAPPROPRIATE_CONDITIONS));
return;
}
// unequip item
if (targetItem.isEquipped())
{
L2ItemInstance[] unequiped = activeChar.getInventory().unEquipItemInSlotAndRecord(targetItem.getLocationSlot());
InventoryUpdate iu = new InventoryUpdate();
for (L2ItemInstance itm : unequiped)
iu.addModifiedItem(itm);
activeChar.sendPacket(iu);
activeChar.broadcastUserInfo();
}
// consume the life stone
if (!activeChar.destroyItem("RequestRefine", refinerItem, 1, null, false))
return;
// consume the gemstones
if (!activeChar.destroyItem("RequestRefine", gemStoneItem, _gemStoneCount, null, false))
return;
final L2Augmentation aug = AugmentationData.getInstance().generateRandomAugmentation(lifeStoneLevel, lifeStoneGrade, targetItem.getItem().getBodyPart());
targetItem.setAugmentation(aug);
final int stat12 = 0x0000FFFF & aug.getAugmentationId();
final int stat34 = aug.getAugmentationId() >> 16;
activeChar.sendPacket(new ExVariationResult(stat12,stat34,1));
InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(targetItem);
activeChar.sendPacket(iu);
StatusUpdate su = new StatusUpdate(activeChar);
su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad());
activeChar.sendPacket(su);
}
Что я нашёл ещё, в сервер пакетах есть вот это:
CharSelectionInfo.java
Код: writeD(charInfoPackage.getAugmentationId());
А ниже:
1
Код: // Get the augmentation id for equipped weapon
int weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_LRHAND);
if (weaponObjId < 1)
weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND);
if (weaponObjId > 0)
{
Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT augAttributes FROM item_attributes WHERE itemId=?");
statement.setInt(1, weaponObjId);
ResultSet result = statement.executeQuery();
if (result.next())
{
int augment = result.getInt("augAttributes");
charInfopackage.setAugmentationId(augment == -1 ? 0 : augment);
}
result.close();
statement.close();
}
catch (Exception e)
{
_log.log(Level.WARNING, "Could not restore augmentation info: " + e.getMessage(), e);
}
finally { try { L2DatabaseFactory.close(con); } catch (Exception e) {} }
}
Добавлено через 22 минуты
Исходники
http://dump.ru/file/5885216
Добавлено через 1 час 51 минуту
Продебажил весь процесс аугментации, разницы между аугментом армора и оружия не увидел. В обоих случаях в итоге шлётся:
Код: final int stat12 = 0x0000FFFF & aug.getAugmentationId();
final int stat34 = aug.getAugmentationId() >> 16;
activeChar.sendPacket(new ExVariationResult(stat12,stat34,1));
InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(targetItem);
activeChar.sendPacket(iu);
И всё.
Добавлено через 1 час 53 минуты
Весь класс вот:
Код: public class ExVariationResult extends L2GameServerPacket
{
private static final String _S__FE_55_EXVARIATIONRESULT = "[S] FE:56 ExVariationResult";
private int _stat12;
private int _stat34;
private int _unk3;
public ExVariationResult(int unk1, int unk2, int unk3)
{
_stat12 = unk1;
_stat34 = unk2;
_unk3 = unk3;
}
/**
* @see ru.l2open.util.network.BaseSendablePacket.ServerBasePacket#writeImpl()
*/
@Override
protected void writeImpl()
{
writeC(0xfe);
writeH(0x56);
writeD(_stat12);
writeD(_stat34);
writeD(_unk3);
}
/**
* @see ru.l2open.gameserver.BasePacket#getType()
*/
@Override
public String getType()
{
return _S__FE_55_EXVARIATIONRESULT;
}
}
Добавлено через 1 час 55 минут
А вот вторая часть, InventoryUpdate.java
1
Код: /*
* 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 ru.l2open.gameserver.network.serverpackets;
import java.util.List;
import java.util.logging.Logger;
import ru.l2open.Config;
import ru.l2open.gameserver.model.ItemInfo;
import ru.l2open.gameserver.model.L2ItemInstance;
import javolution.util.FastList;
/**
*
* 37 // Packet Identifier <BR>
* 01 00 // Number of ItemInfo Trame of the Packet <BR><BR>
*
* 03 00 // Update type : 01-add, 02-modify, 03-remove <BR>
* 04 00 // Item Type 1 : 00-weapon/ring/earring/necklace, 01-armor/shield, 04-item/questitem/adena <BR>
* c6 37 50 40 // ObjectId <BR>
* cd 09 00 00 // ItemId <BR>
* 05 00 00 00 // Quantity <BR>
* 05 00 // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item <BR>
* 00 00 // Filler (always 0) <BR>
* 00 00 // Equipped : 00-No, 01-yes <BR>
* 00 00 // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand <BR>
* 00 00 // Enchant level (pet level shown in control item) <BR>
* 00 00 // Pet name exists or not shown in control item <BR><BR><BR>
*
*
* format h (hh dddhhhh hh) revision 377 <BR>
* format h (hh dddhhhd hh) revision 415 <BR><BR>
*
* @version $Revision: 1.3.2.2.2.4 $ $Date: 2005/03/27 15:29:39 $
* Rebuild 23.2.2006 by Advi
*/
public class InventoryUpdate extends L2GameServerPacket
{
private static final Logger _log = Logger.getLogger(InventoryUpdate.class.getName());
private static final String _S__37_INVENTORYUPDATE = "[S] 21 InventoryUpdate";
private List<ItemInfo> _items;
public InventoryUpdate()
{
_items = new FastList<ItemInfo>();
if (Config.DEBUG)
{
showDebug();
}
}
/**
* @param items
*/
public InventoryUpdate(List<ItemInfo> items)
{
_items = items;
if (Config.DEBUG)
{
showDebug();
}
}
public void addItem(L2ItemInstance item)
{
if (item != null)
_items.add(new ItemInfo(item));
}
public void addNewItem(L2ItemInstance item)
{
if (item != null)
_items.add(new ItemInfo(item, 1));
}
public void addModifiedItem(L2ItemInstance item)
{
if (item != null)
_items.add(new ItemInfo(item, 2));
}
public void addRemovedItem(L2ItemInstance item)
{
if (item != null)
_items.add(new ItemInfo(item, 3));
}
public void addItems(List<L2ItemInstance> items)
{
if (items != null)
for (L2ItemInstance item : items)
if (item != null)
_items.add(new ItemInfo(item));
}
private void showDebug()
{
for (ItemInfo item : _items)
{
_log.fine("oid:" + Integer.toHexString(item.getObjectId()) + " item:" + item.getItem().getName() + " last change:" + item.getChange());
}
}
@Override
protected final void writeImpl()
{
// Compatibility patch
final boolean oldProtocol = getClient().isOldProtocol();
// End of compatibility patch
writeC(0x21);
int count = _items.size();
writeH(count);
for (ItemInfo item : _items)
{
writeH(item.getChange()); // Update type : 01-add, 02-modify, 03-remove
writeH(item.getItem().getType1()); // Item Type 1 : 00-weapon/ring/earring/necklace, 01-armor/shield, 04-item/questitem/adena
writeD(item.getObjectId()); // ObjectId
writeD(item.getItem().getItemDisplayId()); // ItemId
writeD(item.getLocation()); // T1
writeQ(item.getCount()); // Quantity
writeH(item.getItem().getType2()); // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item
writeH(item.getCustomType1()); // Filler (always 0)
writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
writeD(item.getItem().getBodyPart()); // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
writeH(item.getEnchant()); // Enchant level (pet level shown in control item)
writeH(item.getCustomType2()); // Pet name exists or not shown in control item
writeD(item.getAugmentationBonus());
writeD(item.getMana());
// T1
writeH(item.getAttackElementType());
writeH(item.getAttackElementPower());
for (byte i = 0; i < 6; i++)
writeH(item.getElementDefAttr(i));
// T2
writeD(item.getTime());
// Compatibility patch
if (oldProtocol)
continue;
// End of compatibility patch
writeH(0x00); // Enchant effect 1
writeH(0x00); // Enchant effect 2
writeH(0x00); // Enchant effect 3
}
_items.clear();
_items = null;
}
/* (non-Javadoc)
* @see ru.l2open.gameserver.serverpackets.ServerBasePacket#getType()
*/
@Override
public String getType()
{
return _S__37_INVENTORYUPDATE;
}
}
|