DevGoD 342 Опубликовано 9 сентября, 2013 Собственно сабж. Занялся проработкой отображения времени отката инстанса. Сделал всё, кроме отображения корректного времени отката. По коду как то так: Player.java public Map<Integer, Long> getAllInstanceTimes(int playerObjId) { if (!_playerInstanceTimes.containsKey(Integer.valueOf(playerObjId))) { loadInstanceReuses(); } return _playerInstanceTimes.get(Integer.valueOf(playerObjId)); } public Map<Integer, Long> getInstanceReuses() { return _instancesReuses; } private void loadInstanceReuses() { Connection con = null; PreparedStatement offline = null; ResultSet rs = null; try { con = DatabaseFactory.getInstance().getConnection(); offline = con.prepareStatement("SELECT * FROM character_instances WHERE obj_id = ?"); offline.setInt(1, getObjectId()); rs = offline.executeQuery(); while(rs.next()) { int id = rs.getInt("id"); long reuse = rs.getLong("reuse"); _instancesReuses.put(id, reuse); } } catch(Exception e) { _log.error("", e); } finally { DbUtils.closeQuietly(con, offline, rs); } } Далее, получив данные из таблицы, к примеру 205,1378764709154 где 205 - id, 1378764709154 - reuse Пишем это дело в пакет. public class ExInzoneWaitingInfo extends L2GameServerPacket { private static final Logger _log = LoggerFactory.getLogger(ExInzoneWaitingInfo.class); private int _currentInzoneID = -1; private int _StoryId; private long _storyReuse; Map<Integer, Integer> _instanceTimes; private int instRe; private int thisRef; public ExInzoneWaitingInfo(Player player) { _instanceTimes = new FastMap<Integer, Integer>(); if(player.getActiveReflection() == null) { thisRef = 0; } else { thisRef = player.getActiveReflection().getInstancedZoneId(); } player.getAllInstanceTimes(player.getObjectId()); Map<Integer,Long> maps = player.getInstanceReuses(); for(int instanceId : maps.keySet()) { int remainingTime = (int)((((Long)maps.get(Integer.valueOf(instanceId))).longValue() - System.currentTimeMillis()) / 1000L); _log.info("Current reuse : "+ ((Long)maps.get(Integer.valueOf(instanceId)).longValue())); _instanceTimes.put(Integer.valueOf(instanceId), Integer.valueOf(remainingTime)); } } @Override protected void writeImpl() { writeD(thisRef); //Обозначаем Текущий инстанс writeD(_instanceTimes.size()); for(int instanceId : _instanceTimes.keySet()) { //instReenter = (int) instRe; writeD(instanceId); //Недоступное подземелье writeD(((Integer)_instanceTimes.get(Integer.valueOf(instanceId))).intValue()); //Откат } } } При этом, получаем remainingTime < 0 Что в принципе неправильно. Где я накосячил, подскажите пожалуйста. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
KilRoy 46 Опубликовано 9 сентября, 2013 На корню не правильно. package ru.ljts.gameserver.network.lineage.serverpackets; import java.util.Iterator; import java.util.Map; import javolution.util.FastMap; import ru.ljts.gameserver.data.xml.holder.InstantZoneHolder; import ru.ljts.gameserver.model.Player; /** * @author KilRoy */ public class ExInZoneWaitingInfo extends L2GameServerPacket { private int instanceZoneId = -1; private Map<Integer, Integer> collapseInstanceTime; public ExInZoneWaitingInfo(Player player) { collapseInstanceTime = new FastMap<Integer, Integer>(); if(player.getActiveReflection() != null) instanceZoneId = player.getActiveReflection().getInstancedZoneId(); for(int i : player.getInstanceReuses().keySet()) { int timeToCollapse = InstantZoneHolder.getInstance().getMinutesToNextEntrance(i, player); if(timeToCollapse > 0) collapseInstanceTime.put(i, timeToCollapse * 60); } } @Override protected void writeImpl() { writeFe(getClass()); writeD(instanceZoneId); writeD(collapseInstanceTime.size()); for(Iterator<Integer> i = collapseInstanceTime.keySet().iterator(); i.hasNext() { int currentInstanceId = i.next().intValue(); writeD(currentInstanceId); writeD((collapseInstanceTime.get(currentInstanceId))); } } } 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DevGoD 342 Опубликовано 9 сентября, 2013 Благодарю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты