Сообщений: 527
Тем: 17
Зарегистрирован: Oct 2010
Репутация:
1,919
знает ли кто где скачать клиент 603 протокола? ибо на офе уже 606, а патчится он не хочет, тупо после патчинга не запускается клиент.
Сообщений: 666
Тем: 15
Зарегистрирован: Aug 2014
Репутация:
1,790
10-24-2014, 06:40 PM
(Сообщение последний раз редактировалось: 10-24-2014, 06:59 PM Influence.)
Не работают все параметры, только если в вкладке Цель включить отображение Сопротивление, то для всех остальных типов целей, отображается урон с авто-атаки(в виде регена на цели почему то), и во время критической атаки вылетает цифра раза в 2.5 больше от крита, подскажите пожалуйста, в какую сторону копать?
Возможно уже это выкладывали, но поиск подобного не дал результатов.
Добавлено через 18 минут
п.с. мобиус 531 протокол
Сообщений: 441
Тем: 15
Зарегистрирован: Oct 2012
Репутация:
3,319
Influence Написал:
Не работают все параметры, только если в вкладке Цель включить отображение Сопротивление, то для всех остальных типов целей, отображается урон с авто-атаки(в виде регена на цели почему то), и во время критической атаки вылетает цифра раза в 2.5 больше от крита, подскажите пожалуйста, в какую сторону копать?
Возможно уже это выкладывали, но поиск подобного не дал результатов.
Добавлено через 18 минут
п.с. мобиус 531 протокол Клиент предназначен для протоколов выше, я думаю. Завтра вечером залью нужные файлы и выложу. Должно помочь.
Сообщений: 666
Тем: 15
Зарегистрирован: Aug 2014
Репутация:
1,790
Спасибо, буду ждать.
клиент 531, систем та что мне выкладывали несколько страниц назад.
Сообщений: 441
Тем: 15
Зарегистрирован: Oct 2012
Репутация:
3,319
Influence Написал:Спасибо, буду ждать.
клиент 531, систем та что мне выкладывали несколько страниц назад.
ссылко
http://file.sampo.ru/3456dr/
Если не поможет, значит дело в пакетной части.
Сообщений: 666
Тем: 15
Зарегистрирован: Aug 2014
Репутация:
1,790
elastic Написал:
ссылко
http://file.sampo.ru/3456dr/
Если не поможет, значит дело в пакетной части.
Заменил файлы, не помогло к сожалению.
Вот скрин для наглядности что происходит:
936 это крит, обычная атака пишется так же, 3600 неизвестно откуда берется.
Сообщений: 202
Тем: 2
Зарегистрирован: Jun 2008
Репутация:
783
Influence Написал:Заменил файлы, не помогло к сожалению.
Вот скрин для наглядности что происходит:
936 это крит, обычная атака пишется так же, 3600 неизвестно откуда берется.
Пакет Attack и StatusUpdate исправьте и в нужных местах в SystemMessage добавьте информации и демаге.
Сообщений: 666
Тем: 15
Зарегистрирован: Aug 2014
Репутация:
1,790
10-25-2014, 11:35 PM
(Сообщение последний раз редактировалось: 10-27-2014, 01:28 PM Influence.)
Bonux Написал:Пакет Attack и StatusUpdate исправьте и в нужных местах в SystemMessage добавьте информации и демаге.
Attack
PHP код: <?php
/*
* 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 lineage2.gameserver.network.serverpackets;
import lineage2.gameserver.model.Creature;
import lineage2.gameserver.model.GameObject;
/**
* sample 06 8f19904b 2522d04b 00000000 80 950c0000 4af50000 08f2ffff 0000 - 0 damage (missed 0x80) 06 85071048 bc0e504b 32000000 10 fc41ffff fd240200 a6f5ffff 0100 bc0e504b 33000000 10 3....
* <p/>
* format dddc dddh (ddc)
*/
public class Attack extends L2GameServerPacket
{
private static final int FLAG = 0x00; // Usual kick unprinted.
private static final int FLAG_MISS = 0x01; // Dodged the blow.
private static final int FLAG_CRIT = 0x04; // Crit.
private static final int FLAG_SHIELD = 0x06; // Block Crit.
private static final int FLAG_SOULSHOT = 0x08; // Beat with a pacifier.
private class Hit
{
int _targetId, _damage, _flags;
Hit(GameObject target, int damage, boolean miss, boolean crit, boolean shld)
{
_targetId = target.getObjectId();
_damage = damage;
_flags = FLAG;
if (miss)
{
_flags = FLAG_MISS;
}
else if (shld)
{
_flags = FLAG_SHIELD;
}
else if (crit)
{
_flags = FLAG_CRIT;
}
if (_soulshot)
{
_flags |= FLAG_SOULSHOT;
}
}
}
private final int _attackerId;
public final boolean _soulshot;
private final int _grade;
private final int _x;
private final int _y;
private final int _z;
private final int _tx;
private final int _ty;
private final int _tz;
private Hit[] hits;
public Attack(Creature attacker, Creature target, boolean ss, int grade)
{
_attackerId = attacker.getObjectId();
_soulshot = ss;
_grade = grade;
_x = attacker.getX();
_y = attacker.getY();
_z = attacker.getZ();
_tx = target.getX();
_ty = target.getY();
_tz = target.getZ();
hits = new Hit[0];
}
/**
* Add this hit (target, damage, miss, critical, shield) to the Server-Client packet Attack.<BR>
* <BR>
* @param target
* @param damage
* @param miss
* @param crit
* @param shld
*/
public void addHit(GameObject target, int damage, boolean miss, boolean crit, boolean shld)
{
// Get the last position in the hits table
int pos = hits.length;
// Create a new Hit object
Hit[] tmp = new Hit[pos + 1];
// Add the new Hit object to hits table
System.arraycopy(hits, 0, tmp, 0, hits.length);
tmp[pos] = new Hit(target, damage, miss, crit, shld);
hits = tmp;
}
/**
* Return True if the Server-Client packet Attack conatins at least 1 hit.<BR>
* <BR>
* @return
*/
public boolean hasHits()
{
return hits.length > 0;
}
@Override
protected final void writeImpl()
{
writeC(0x33);
writeD(_attackerId);
writeD(hits[0]._targetId);
writeC(0x01); //??
writeD(hits[0]._damage);
writeD(hits[0]._flags);
writeD(_grade);
writeD(_x);
writeD(_y);
writeD(_z);
writeH(hits.length - 1);
for (int i = 1; i < hits.length; i++)
{
writeD(hits[i]._targetId);
writeD(hits[i]._damage);
writeD(hits[i]._flags);
writeD(_grade);
}
writeD(_tx);
writeD(_ty);
writeD(_tz);
}
}
StatusUpdate
PHP код: <?php
/*
* 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 lineage2.gameserver.network.serverpackets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import lineage2.gameserver.model.Creature;
import lineage2.gameserver.model.Player;
public class StatusUpdate extends L2GameServerPacket
{
private final Creature _actor;
private List<int[]> attributes = Collections.emptyList();
private boolean hpRegActive = true;
public StatusUpdate setHpRegActive(boolean v)
{
hpRegActive = v;
return this;
}
public StatusUpdate(Creature creature)
{
_actor = creature;
}
public StatusUpdate addAttribute(StatusUpdateField... types)
{
for (StatusUpdateField s : types)
{
addAttribute(s);
}
return this;
}
public StatusUpdate addAttribute(Collection<StatusUpdateField> types)
{
for (StatusUpdateField s : types)
{
addAttribute(s);
}
return this;
}
public StatusUpdate addAttribute(StatusUpdateField type, int val)
{
if (attributes.isEmpty())
{
attributes = new ArrayList<>();
}
attributes.add(new int[]
{
type.ordinal(),
val
});
return this;
}
public StatusUpdate addAttribute(StatusUpdateField type)
{
int value = -1;
switch (type)
{
case LEVEL:
{
value = _actor.getLevel();
break;
}
case EXP:
{
// long?
break;
}
case STR:
{
value = _actor.getSTR();
break;
}
case DEX:
{
value = _actor.getDEX();
break;
}
case CON:
{
value = _actor.getCON();
break;
}
case INT:
{
value = _actor.getINT();
break;
}
case WIT:
{
value = _actor.getWIT();
break;
}
case MEN:
{
value = _actor.getMEN();
break;
}
case CUR_HP:
{
value = (int) _actor.getCurrentHp();
break;
}
case MAX_HP:
{
value = _actor.getMaxHp();
break;
}
case CUR_MP:
{
value = (int) _actor.getCurrentMp();
break;
}
case MAX_MP:
{
value = _actor.getMaxMp();
break;
}
case SP:
{
// if (_actor.isPlayable() && (_actor.isPlayer() || _actor.isPet()))
// {
// }
break;
}
case CUR_LOAD:
{
if (_actor.isPlayer())
{
value = _actor.getPlayer().getCurrentLoad();
}
break;
}
case MAX_LOAD:
{
if (_actor.isPlayer())
{
value = _actor.getPlayer().getMaxLoad();
}
break;
}
case P_ATK:
{
value = _actor.getPAtk(null);
break;
}
case ATK_SPD:
{
value = _actor.getPAtkSpd();
break;
}
case P_DEF:
{
value = _actor.getPDef(null);
break;
}
case EVASION:
{
value = _actor.getEvasionRate(null);
break;
}
case ACCURACY:
{
value = _actor.getAccuracy();
break;
}
case CRITICAL:
{
value = _actor.getCriticalHit(null, null);
break;
}
case M_ATK:
{
value = _actor.getMAtk(null, null);
break;
}
case CAST_SPD:
{
value = _actor.getMAtkSpd();
break;
}
case M_DEF:
{
value = _actor.getMDef(null, null);
break;
}
case PVP_FLAG:
{
if (_actor.isPlayable())
{
value = _actor.getPvpFlag();
}
break;
}
case KARMA:
{
if (_actor.isPlayable())
{
value = _actor.getKarma();
}
break;
}
case CUR_CP:
{
if (_actor.isPlayer())
{
value = (int) _actor.getCurrentCp();
}
break;
}
case MAX_CP:
{
if (_actor.isPlayer())
{
value = _actor.getMaxCp();
}
break;
}
default:
break;
}
if (value != -1)
{
if (attributes.isEmpty())
{
attributes = new ArrayList<>();
}
attributes.add(new int[]
{
type.ordinal(),
value
});
}
return this;
}
@Override
protected final void writeImpl()
{
if (isEmpty())
{
return;
}
writeC(0x18);
writeD(_actor.getObjectId());
writeD(getReceiverId());
writeD(hpRegActive);
writeD(attributes.size());
for (int[] temp : attributes)
{
writeD(temp[0]);
writeD(temp[1]);
}
}
public boolean isEmpty()
{
return attributes.isEmpty();
}
private int getReceiverId()
{
if (getClient().getActiveChar() != null)
{
Player act = getClient().getActiveChar();
if ((act == _actor) || (act.getTarget() == _actor))
{
return act.getObjectId();
}
}
return 0;
}
public static enum StatusUpdateField
{
NONE(false), // 0
LEVEL(true), // 1
EXP(true), // 2
STR(true), // 3
DEX(true), // 4
CON(true), // 5
INT(true), // 6
WIT(true), // 7
MEN(true), // 8
CUR_HP(false), // 9
MAX_HP(false), // 10
CUR_MP(true), // 11
MAX_MP(true), // 12
SP(true), // 13
CUR_LOAD(true), // 14
MAX_LOAD(true), // 15
UNKNOWN1(false), // 16
P_ATK(true), // 17
ATK_SPD(false), // 18
P_DEF(true), // 19
EVASION(true), // 20
ACCURACY(true), // 21
CRITICAL(true), // 22
M_ATK(true), // 23
CAST_SPD(false), // 24
M_DEF(false), // 25
PVP_FLAG(false), // 26
KARMA(false), // 27
UNKNOWN3(false), // 28
UNKNOWN4(false), // 29
UNKNOWN5(false), // 30
UNKNOWN6(false), // 31
UNKNOWN7(false), // 32
CUR_CP(true), // 33
MAX_CP(true);// 34
final boolean _privateParam;
private StatusUpdateField(boolean privateParam)
{
_privateParam = privateParam;
}
public boolean isPrivateParam()
{
return _privateParam;
}
}
}
Вроде эти пакеты правильные
все оказалось куда проще, урон нужно отправлять как -damage
Заметил еще 1ну неточность, при маг крит уроне, над целью не выскакивает надпись "Крит." хотя урон пишет.
Сообщений: 666
Тем: 15
Зарегистрирован: Aug 2014
Репутация:
1,790
10-27-2014, 12:26 AM
(Сообщение последний раз редактировалось: 10-28-2014, 12:40 PM Influence.)
broadcastStatusUpdate
PHP код: <?php
/**
* Method broadcastStatusUpdate.
*/
public void broadcastStatusUpdate()
{
if (!needStatusUpdate())
{
return;
}
StatusUpdate statusUpdatePacket = new StatusUpdate(this).addAttribute(StatusUpdateField.CUR_HP, StatusUpdateField.MAX_HP);
for (final Player pla : World.getAroundPlayers(this))
{
if (pla == null)
{
continue;
}
pla.sendPacket(statusUpdatePacket);
}
}
setTarget
PHP код: <?php
/**
* Method setTarget.
* @param newTarget GameObject
*/
@Override
public void setTarget(GameObject newTarget)
{
// Check if the new target is visible
if ((newTarget != null) && !newTarget.isVisible())
{
newTarget = null;
}
GameObject oldTarget = getTarget();
if (oldTarget != null)
{
if (oldTarget.equals(newTarget))
{
return;
}
if (oldTarget.isCreature())
{
((Creature) oldTarget).removeStatusListener(this);
}
broadcastPacket(new TargetUnselected(this));
}
if (newTarget != null)
{
if (newTarget.isCreature())
{
((Creature) newTarget).addStatusListener(this);
if (newTarget.displayHpBar())
{
sendPacket(new StatusUpdate(((Creature) newTarget)).addAttribute(StatusUpdateField.MAX_HP, StatusUpdateField.CUR_HP));
}
}
updateTargetSelectionInfo(newTarget);
broadcastPacketToOthers(new TargetSelected(getObjectId(), newTarget.getObjectId(), getLoc()));
}
super.setTarget(newTarget);
}
С уроном более менее разобрался, остались мелочи, но никак не получается исправить.
В общем, когда меняется полоска на хп баре моба, вылетает белый текст равный количеству хп которое отнялось(5 ударов по 300 урона к примеру, после 5 удара апдейтиться полоска на хп баре и белым текстом пишет 1500).
При каждом новом выборе одной и той же цели, у которой было не фул хп, выскакивает надпись равная отрегененому хп с последнего взятия таргета.
То что за отображение отвечает hpRegActive в StatusUpdate я понял, но на примере l2next там чекается только аргументы max_cp и cur_cp, остальное отправляется так же как и в Mobius, но результат почему то разный.
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
Influence Написал:Заметил еще 1ну неточность, при маг крит уроне, над целью не выскакивает надпись "Крит." хотя урон пишет. а везде где нужно шлешь пакет ExMagicAttackInfo с нужным содержимым?
Код: package l2p.gameserver.network.serverpackets;
import l2p.gameserver.model.Creature;
import l2p.gameserver.network.serverpackets.components.Opcode;
public class ExMagicAttackInfo extends L2GameServerPacket
{
public static final int NORMAL = 0;
public static final int CRIT = 1;
public static final int CRIT_ADD = 2;
public static final int OVERHIT = 3;
public static final int MISS = 4;
public static final int BLOCK = 5;
public static final int RESIST = 6;
public static final int IMMUNE = 7;
private Creature _attacker;
private Creature _target;
private int _info;
public ExMagicAttackInfo(Creature attacker, Creature target, int info)
{
_attacker = attacker;
_target = target;
_info = info;
}
@Override
protected void writeImpl()
{
writeEx(Opcode.ExMagicAttackInfo);
writeD(_attacker.getObjectId());
writeD(_target.getObjectId());
writeD(_info);
}
}
|