Вывод хп цели - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Ответ
Опции темы
Непрочитано 31.01.2019, 18:05   #1
Пользователь

Автор темы (Топик Стартер) Вывод хп цели

Сборка l2ft (хф) interface.u уже патченный.
Уже заморочился танцевать с бубном.
Что имеем сейчас:
+Вижу хп\ману мобов, персонажей.
Косяки:
- Если взять в таргет персонажа с фулманой, то мана может соответствовать показателю последней цели(заполненность полоски). Пока тот не сделает изменение - не обновит.
- Первая цель которую мы берем в таргет после захода в игру(моб\игрок) имеет пустую полоску маны, видать т.к. неоткуда еще не получали значение.

Так понимаю что оно показатели шлет пакетом только при обновлении значения.
Еще есть незначительные задержки отображения маны если менять мобов /nexttarget, но это можно списать на слабенький ноут, а может и метод-костыль действительно кривой и надо переделать всё
А реально ли сделать что б взяв в таргет сразу все отображало корректно? (по методу хп монстра\персонажа из пати). Пока цеплялся за эти ключевые моменты, думаю нас интересует первый класс:
Player.java
 
	public void broadcastStatusUpdate()
	{
		if(!needStatusUpdate()) //По идее еше должно срезать траффик. Будут глюки с отображением - убрать это условие.
			return;
 
		StatusUpdate su = makeStatusUpdate(StatusUpdate.MAX_HP, StatusUpdate.MAX_MP, StatusUpdate.MAX_CP, StatusUpdate.CUR_HP, StatusUpdate.CUR_MP, StatusUpdate.CUR_CP);
		sendPacket(su);
		broadcastToStatusListeners(su); //Этой строчкой добилсятого что сейчас есть, отображает персонажа.
		// Check if a party is in progress
		if(isInParty())
			// Send the Server->Client packet PartySmallWindowUpdate with current HP, MP and Level to all other L2Player of the Party
			getParty().broadcastToPartyMembers(this, new PartySmallWindowUpdate(this));
 
		DuelEvent duelEvent = getEvent(DuelEvent.class);
		if(duelEvent != null)
			duelEvent.sendPacket(new ExDuelUpdateUserInfo(this), getTeam().revert().name());
 
		if(isInOlympiadMode() && isOlympiadCompStart())
		{
			if(_olympiadGame != null)
				_olympiadGame.broadcastInfo(this, null, false);
		}
	}
 
	public void setObjectTarget(GameObject target)
	{
		setTarget(target);
		if(target == null)
			return;
 
		if(target == getTarget())
		{
			if(target.isNpc())
			{
				NpcInstance npc = (NpcInstance) target;
				sendPacket(new MyTargetSelected(npc.getObjectId(), getLevel() - npc.getLevel()));
				sendPacket(npc.makeStatusUpdate(StatusUpdate.CUR_HP, StatusUpdate.MAX_HP, StatusUpdate.CUR_MP, StatusUpdate.MAX_MP));
				sendPacket(new ValidateLocation(npc), ActionFail.STATIC);
			}
			else
				sendPacket(new MyTargetSelected(target.getObjectId(), 0));
		}
	}
 
	@Override
	public void setTarget(GameObject newTarget)
	{
		// Check if the new target is visible
		if(newTarget != null && !newTarget.isVisible())
			newTarget = null;
 
		// Can't target and attack festival monsters if not participant
		if(newTarget instanceof FestivalMonsterInstance && !isFestivalParticipant())
			newTarget = null;
 
		Party party = getParty();
 
		// Can't target and attack rift invaders if not in the same room
		if(party != null && party.isInDimensionalRift())
		{
			int riftType = party.getDimensionalRift().getType();
			int riftRoom = party.getDimensionalRift().getCurrentRoom();
			if(newTarget != null && !DimensionalRiftManager.getInstance().getRoom(riftType, riftRoom).checkIfInZone(newTarget.getX(), newTarget.getY(), newTarget.getZ()))
				newTarget = null;
		}
 
		GameObject oldTarget = getTarget();
 
		if(oldTarget != null)
		{
			if(oldTarget.equals(newTarget))
				return;
 
			// Remove the L2Player from the _statusListener of the old target if it was a L2Character
			if(oldTarget.isCreature())
				((Creature) oldTarget).removeStatusListener(this);
 
			broadcastPacket(new TargetUnselected(this));
		}
 
		if(newTarget != null)
		{
			// Add the L2Player to the _statusListener of the new target if it's a L2Character
			if(newTarget.isCreature())
				((Creature) newTarget).addStatusListener(this);
 
			broadcastPacket(new TargetSelected(this, newTarget.getObjectId(), getLoc()));
		}
 
		super.setTarget(newTarget);
	}
Code: Java
Creature.java //тут ничего не копал особо, но ту самую строчку, в остальном неинтересно думаю.
	public void broadcastStatusUpdate()
	{
		if(!needStatusUpdate())
			return;
 
		StatusUpdate su = makeStatusUpdate(StatusUpdate.MAX_HP, StatusUpdate.MAX_MP, StatusUpdate.CUR_HP, StatusUpdate.CUR_MP);
		broadcastToStatusListeners(su);
	}
Code: Java
Даст кто подсказки\наводки?
LifeAfterWoW вне форума Ответить с цитированием
Непрочитано 01.02.2019, 00:01   #2
Пользователь

Автор темы (Топик Стартер) Re: Вывод хп цели

Интересно выделили красным - именно туда и копал, но что-т пока безрезультатно, слабенько шарю, особенно в пакетке, если математику и геймплей приемлемо для обработки кода, то здесь геморы. Компил ругался\нет результатов\только портил

UPD 1. Спасибо за мелкое назидание, пробил все варианты апдейтов в сборке и именно нашел метод как оно апдейтит (выбор в таргет) мобов:
NpcInstance.java //дописав в параметрах таргета cur, max MP они заработали внезапно, осталось найти где берем персонажей аналогичным образом, правда тут проблема - серв хф по дефолту не шлет в таргет даже хп :\
	public void onAction(Player player, boolean shift)
	{
		if(!isTargetable())
		{
			player.sendActionFailed();
			return;
		}
 
		if(player.getTarget() != this)
		{
			player.setTarget(this);
			if(player.getTarget() == this)
				player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()), makeStatusUpdate(StatusUpdate.CUR_HP, StatusUpdate.MAX_HP, StatusUpdate.CUR_MP, StatusUpdate.MAX_MP));
 
			player.sendPacket(new ValidateLocation(this));
			return;
		}...........
Code: Java
Есть идеи у кого-нибудь?) Вроде и не там где надо искал, но может статус персов непосредственно в player.java?


UPD 2. В общем получилось, спасибо за наводку и тому юзеру который компилер interface.u выложил на 2017 НГ )
player.java
Было
			if(player.getTarget() == this)
				player.sendPacket(new MyTargetSelected(getObjectId(), 0)); // The color to display in the select window is White
 
Code: Java
Стало
			....if(player.getTarget() == this)
			{	
				player.sendPacket(new MyTargetSelected(getObjectId(), 0)); // The color to display in the select window is White
				player.sendPacket(makeStatusUpdate(StatusUpdate.CUR_HP, StatusUpdate.MAX_HP, StatusUpdate.CUR_MP, StatusUpdate.MAX_MP));
			}...
Code: Java
//тупо скопировал метод из NpcInstance, надеюсь покемоны не полезут) Куски кода итд урезаны, но основной мотив понятен, вдруг кому поможет, вот и выкладываю)
Можно закрывать или как там у Вас принято.

Последний раз редактировалось LifeAfterWoW; 01.02.2019 в 02:18.
LifeAfterWoW вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цели не видно diadona Работа с геодатой 4 09.10.2016 02:58
Радиус захвата цели Map Lineage II 15 20.11.2015 16:41
вывод как на PTS SkyWard Lineage II 4 03.03.2015 17:12
Вывод lin2pr Курилка / Yak floor 3 04.03.2014 14:26
Вывод вм в Укр devillord Курилка / Yak floor 24 30.09.2013 03:15


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 00:58. Часовой пояс GMT +3.

Вверх