Ну как еще можно сделать? Через создание модельки.Интересует как это было реализовано,
На голом годе вроде ставили, когда было всего несколько хиро слотов.Как-то на каком-то сервере видел такую фичу, как аллея нпс-героев(или статуи) текущего периода, с их никами, с оружием и в броне. Это было очень давно и такое ощущение, что я это придумал, потому что больше ни когда такого не видел на ил серверах. Кто-то видел подобное? Интересует как это было реализовано, если вообще было(вьетнамский флешбэк).
понятно, что через модельки, а как имена подтягивать? постоянно заставлять игроков апдейтить нпснейм, чтобы сменялись имена?Ну как еще можно сделать? Через создание модельки.
По идее просто чаринфо шлёшь с нужной структурой и всё, никакие модельки не нужны.понятно, что через модельки, а как имена подтягивать? постоянно заставлять игроков апдейтиться, чтобы сменялись имена?
Ну грейд брони проверять периодически, если A и выше все слоты, то записать данные)Только нужно определиться, слать всегда актуальный чаринфо, или делать слепок в какой-то период, что тоже не всегда хорошо может получиться, ибо чар не презентабельно одет будет )
package l2p.gameserver.network.s2c;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.instances.StatueInstance;
import l2p.gameserver.network.components.Opcode;
public class ServerObjectInfo extends L2GameServerPacket
{
private final String _name;
private final boolean _attackable;
private final double _colRadius, _colHeight;
private final int _id;
private final int _objId;
private final int _x, _y, _z, _heading;
private final int _templateId;
private final int _classId;
private final int _raceId;
private final int _sex;
private final int _face;
private final int _hairStyle;
private final int _hairColor;
private final int _head;
private final int _rHand;
private final int _lHand;
private final int _chest;
private final int _gloves;
private final int _legs;
private final int _feet;
private final int _cloak;
private final int _hair1;
private final int _hair2;
private final int _neck;
public ServerObjectInfo(StatueInstance statue, Creature actor)
{
_id = statue.getTemplate().getType().getId();
_objId = statue.getObjectId();
_templateId = 1000000;
_name = statue.getTemplate().getName();
_attackable = statue.isAttackable(actor, null);
_x = statue.getX();
_y = statue.getY();
_z = statue.getZ();
_heading = statue.getHeading();
_colRadius = statue.getColRadius();
_colHeight = statue.getColHeight();
_classId = statue.getTemplate().getClassId();
_raceId = statue.getTemplate().getRaceId();
_sex = statue.getTemplate().getSex();
_hairStyle = statue.getTemplate().getHairStyle();
_hairColor = statue.getTemplate().getHairColor();
_face = statue.getTemplate().getFace();
_neck = statue.getTemplate().getNecklace();
_head = statue.getTemplate().getHead();
_rHand = statue.getTemplate().getRHand();
_lHand = statue.getTemplate().getLHand();
_gloves = statue.getTemplate().getGloves();
_chest = statue.getTemplate().getChest();
_legs = statue.getTemplate().getLegs();
_feet = statue.getTemplate().getFeet();
_cloak = statue.getTemplate().getCloak();
_hair1 = statue.getTemplate().getHair1();
_hair2 = statue.getTemplate().getHair2();
}
@Override
protected void writeImpl()
{
writeC(Opcode.ServerObjectInfo);
writeD(_objId);
writeD(_templateId + 1000000);
writeS(_name); // name
writeD(_attackable ? 1 : 0);
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
writeF(1.0); // movement multiplier
writeF(1.0); // attack speed multiplier
writeF(_colRadius);
writeF(_colHeight);
writeD(0); // Current HP
writeD(0); // Max HP
writeD(7); // Color
writeD(0x00);
writeD(_id);
writeD(0x00);
writeD(0x00); // Social ID
writeD(0x00); // Social frame
writeD(_classId);
writeD(_raceId);
writeD(_sex);
writeD(_hairStyle);
writeD(_hairColor);
writeD(_face);
writeD(_neck);
writeD(_head);
writeD(_rHand);
writeD(_lHand);
writeD(_gloves);
writeD(_chest);
writeD(_legs);
writeD(_feet);
writeD(_cloak);
writeD(_hair1);
writeD(_hair2);
}
}
package l2p.gameserver.model.instances;
import java.util.ArrayList;
import java.util.List;
import l2p.gameserver.ai.CtrlIntention;
import l2p.gameserver.config.NpcConfig;
import l2p.gameserver.config.OtherConfig;
import l2p.gameserver.enums.StatisticTopType;
import l2p.gameserver.holders.statistic.StatisticData;
import l2p.gameserver.holders.statistic.StatueTemplate;
import l2p.gameserver.managers.StatisticManager;
import l2p.gameserver.model.Creature;
import l2p.gameserver.model.GameObject;
import l2p.gameserver.model.Location;
import l2p.gameserver.model.Player;
import l2p.gameserver.model.skills.Skill;
import l2p.gameserver.network.s2c.ActionFail;
import l2p.gameserver.network.s2c.ExLoadStatHotLink;
import l2p.gameserver.network.s2c.L2GameServerPacket;
import l2p.gameserver.network.s2c.ServerObjectInfo;
public final class StatueInstance extends GameObject
{
private StatueTemplate _template;
private int _heading;
public StatueInstance(int objectId, StatueTemplate template)
{
super(objectId);
_template = template;
}
public StatueTemplate getTemplate()
{
return _template;
}
@Override
public boolean isAttackable(Creature creature, Skill skill)
{
return false;
}
@Override
public double getColRadius()
{
return 30.;
}
@Override
public double getColHeight()
{
return 40.;
}
@Override
public void setLoc(Location loc)
{
super.setLoc(loc);
_heading = loc.getH();
}
@Override
public int getHeading()
{
return _heading;
}
@Override
public List<L2GameServerPacket> addPacketList(Player forPlayer, Creature dropper)
{
List<L2GameServerPacket> list = new ArrayList<>(1);
list.add(new ServerObjectInfo(this, forPlayer));
return list;
}
@Override
public void onAction(Player player, boolean shift)
{
if (!isInRange(player, NpcConfig.MAX_INTERACTION_RANGE))
{
if (player.getAI().getIntention() != CtrlIntention.AI_INTENTION_INTERACT)
player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this, null);
return;
}
player.stopMove(false);
List<StatisticData> global = StatisticManager.getTop(_template.getType(), StatisticTopType.STATUE_GLOBAL, OtherConfig.STATISTIC_STATUE_TOP_LIMIT);
List<StatisticData> monthly = StatisticManager.getTop(_template.getType(), StatisticTopType.STATUE_MONTHLY, OtherConfig.STATISTIC_STATUE_TOP_LIMIT);
player.sendPacket(new ExLoadStatHotLink(_template.getType().getId(), _template.getType().getSubId(), global, monthly), ActionFail.STATIC);
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?