По вопросу #2:
В папке скриптов датапака можно создавать .java файл, в котором буду описывать любой новый созданный класс и ядро его подхватит и компилируется при загрузке сервера?
Если импортирую в этот мой созданный класс все нужные классы и пакеты, то могу переписать какую-то функцию, чтобы поменять в ней значения? Перед объявлением этой функции нужно вызывать @override ?
package handlers;
import javolution.util.FastList;
import javolution.util.FastMap;
import ru.catssoftware.Config;
import ru.catssoftware.gameserver.model.L2Attackable;
import ru.catssoftware.gameserver.model.L2Boss;
import ru.catssoftware.gameserver.model.L2Character;
import ru.catssoftware.gameserver.model.L2Object;
import ru.catssoftware.gameserver.model.L2Skill;
import ru.catssoftware.gameserver.network.SystemMessageId;
import ru.catssoftware.gameserver.network.serverpackets.L2GameServerPacket;
import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
import ru.catssoftware.tools.random.Rnd;
import ru.catssoftware.util.Log;
public class L2GrandBossInstanceCustom extends L2GrandBossInstance {
private byte _zoneId = 0;
private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance> {
private static GrandBossReturnHomeManager _instance;
private static GrandBossReturnHomeManager getInstance() {
if (_instance == null)
_instance = new GrandBossReturnHomeManager();
return _instance;
}
private GrandBossReturnHomeManager() {
super(5000);
}
protected void callTask(L2GrandBossInstance task) {
task.returnHome();
}
protected String getCalledMethodName() {
return "returnHome()";
}
}
public L2GrandBossInstanceCustom(int objectId, L2NpcTemplate template) {
super(objectId, template);
}
private void setupZone() {
int npcId = getNpcId();
if (npcId == 29001) {
this._zoneId = 20;
} else if (npcId == 29020) {
this._zoneId = 21;
} else if (npcId == 29022 || npcId == 13099) {
this._zoneId = 22;
}
}
@Override
public void returnHome() {
if (getSpawn() != null) {
if (this._zoneId > 0) {
if (!isDead() &&
!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)) {
clearAggroList();
healFull();
teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz());
if (hasMinions())
callMinions(true);
}
} else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
GrandBossReturnHomeManager.getInstance().stopTask(this);
}
} else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) {
GrandBossReturnHomeManager.getInstance().stopTask(this);
}
}
}
public static void main(String [] args) {
// Устанавливаем хандлер для ТВТ эвента
TvT.getInstance().setEventScript(new TVTHandler());
}
!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)
Так у тебя там из коробки вроде 5000 идет значение. Можешь вообще как отдельный конфиг вывести, для удобства.Psycho, да всё из этих статей понятно. Там банальные примеры с парой классов. А тут, на сервере л2 куча классов и методов. Все друг от друга перенимают и используют переменные и методы. Посмотрел я как написан TvTHandler.java в папке \data\scripts\handlers или как написан оффлайн трейд в папке \data\scripts\handlers\voice и на их примере решил написать свой новый класс L2GrandBossInstanceCustom:
В импортах не уверен, что именно лишнее и нужно убрать. В коде убрал все ненужные public, оставил только private, конструктор класса текущего и самое нужное, что надо поменять - метод returnHome с аннотацией @override. У ТВТ класса там еще функция main прямо внутри класса.Java:package handlers; import javolution.util.FastList; import javolution.util.FastMap; import ru.catssoftware.Config; import ru.catssoftware.gameserver.model.L2Attackable; import ru.catssoftware.gameserver.model.L2Boss; import ru.catssoftware.gameserver.model.L2Character; import ru.catssoftware.gameserver.model.L2Object; import ru.catssoftware.gameserver.model.L2Skill; import ru.catssoftware.gameserver.network.SystemMessageId; import ru.catssoftware.gameserver.network.serverpackets.L2GameServerPacket; import ru.catssoftware.gameserver.network.serverpackets.SystemMessage; import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager; import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate; import ru.catssoftware.tools.random.Rnd; import ru.catssoftware.util.Log; public class L2GrandBossInstanceCustom extends L2GrandBossInstance { private byte _zoneId = 0; private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance> { private static GrandBossReturnHomeManager _instance; private static GrandBossReturnHomeManager getInstance() { if (_instance == null) _instance = new GrandBossReturnHomeManager(); return _instance; } private GrandBossReturnHomeManager() { super(5000); } protected void callTask(L2GrandBossInstance task) { task.returnHome(); } protected String getCalledMethodName() { return "returnHome()"; } } public L2GrandBossInstanceCustom(int objectId, L2NpcTemplate template) { super(objectId, template); } private void setupZone() { int npcId = getNpcId(); if (npcId == 29001) { this._zoneId = 20; } else if (npcId == 29020) { this._zoneId = 21; } else if (npcId == 29022 || npcId == 13099) { this._zoneId = 22; } } @Override public void returnHome() { if (getSpawn() != null) { if (this._zoneId > 0) { if (!isDead() && !isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)) { clearAggroList(); healFull(); teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz()); if (hasMinions()) callMinions(true); } } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) { GrandBossReturnHomeManager.getInstance().stopTask(this); } } else if (GrandBossReturnHomeManager.getInstance().hasTask(this)) { GrandBossReturnHomeManager.getInstance().stopTask(this); } } }
Java:public static void main(String [] args) { // Устанавливаем хандлер для ТВТ эвента TvT.getInstance().setEventScript(new TVTHandler()); }
Что именно надо прописывать для моего класса, вообще понятия не имею. А так вообще, в целом, заработает это?
Вообще, я просто хочу поменять значение вот в этой строке:
Сейчас у меня там стоит 2200. Надо сделать 5000 хотя бы. Из-за этого всех РБ невозможно далеко уводить. Тот же Баюм респавнится на свое место с фулл ХП, когда уводишь его чуть дальше середины башни.Java:!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), 5000, false)
package ru.catssoftware.gameserver.model.actor.instance;
import ru.catssoftware.gameserver.model.L2Boss;
import ru.catssoftware.gameserver.model.L2Character;
import ru.catssoftware.gameserver.model.L2Skill;
import ru.catssoftware.gameserver.model.zone.L2Zone;
import ru.catssoftware.gameserver.taskmanager.AbstractIterativePeriodicTaskManager;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
public class L2GrandBossInstance extends L2Boss
{
protected boolean _isInSocialAction = false;
private byte _zoneId = 0;
private static class GrandBossReturnHomeManager extends AbstractIterativePeriodicTaskManager<L2GrandBossInstance>
{
private static GrandBossReturnHomeManager _instance;
private static GrandBossReturnHomeManager getInstance()
{
if (_instance == null)
_instance = new GrandBossReturnHomeManager();
return _instance;
}
private GrandBossReturnHomeManager()
{
super(5000);
}
@Override
protected void callTask(L2GrandBossInstance task)
{
task.returnHome();
}
@Override
protected String getCalledMethodName()
{
return "returnHome()";
}
}
public boolean isInSocialAction()
{
return _isInSocialAction;
}
public void setIsInSocialAction(boolean value)
{
_isInSocialAction = value;
}
public L2GrandBossInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
}
@Override
public boolean doDie(L2Character killer)
{
if (!super.doDie(killer))
return false;
if(_lair!=null)
_lair.setRespawn();
return true;
}
@Override
public void reduceCurrentHp(double damage, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
{
if (isInSocialAction() || isInvul())
return;
super.reduceCurrentHp(damage, attacker, awake, isDOT, skill);
}
@Override
public void doAttack(L2Character target)
{
if (_isInSocialAction)
return;
super.doAttack(target);
}
@Override
public void doCast(L2Skill skill)
{
if (_isInSocialAction)
return;
super.doCast(skill);
}
@Override
public void onSpawn()
{
setIsRaid(true);
setIsGrandBoss(true);
setupZone();
super.onSpawn();
GrandBossReturnHomeManager.getInstance().startTask(this);
}
private void setupZone()
{
int npcId = getNpcId();
if (npcId == 29001)
_zoneId = L2Zone.FLAG_QUEEN;
else if (npcId == 29020)
_zoneId = 21;
else if (npcId == 29022 || npcId == 13099)
_zoneId = 22;
}
@Override
public void deleteMe()
{
if (GrandBossReturnHomeManager.getInstance().hasTask(this))
GrandBossReturnHomeManager.getInstance().stopTask(this);
super.deleteMe();
}
public void returnHome()
{
if (getSpawn() != null)
{
if (_zoneId > 0)
{
if (!isDead())
{
if (!isInsideZone(_zoneId))
{
clearAggroList();
healFull();
teleToLocation(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz());
if (hasMinions())
callMinions(true);
}
}
}
else if (GrandBossReturnHomeManager.getInstance().hasTask(this))
GrandBossReturnHomeManager.getInstance().stopTask(this);
}
else if (GrandBossReturnHomeManager.getInstance().hasTask(this))
GrandBossReturnHomeManager.getInstance().stopTask(this);
}
@Override
public L2GrandBossInstance getGrandBoss()
{
return this;
}
@Override
public boolean isGrandBoss()
{
return true;
}
}
package ru.catssoftware.gameserver.model;
import ru.catssoftware.gameserver.ThreadPoolManager;
import ru.catssoftware.gameserver.instancemanager.BossSpawnManager;
import ru.catssoftware.gameserver.instancemanager.RaidPointsManager;
import ru.catssoftware.gameserver.instancemanager.grandbosses.BossLair;
import ru.catssoftware.gameserver.model.actor.instance.L2MonsterInstance;
import ru.catssoftware.gameserver.model.actor.instance.L2PcInstance;
import ru.catssoftware.gameserver.network.SystemMessageId;
import ru.catssoftware.gameserver.network.serverpackets.SystemMessage;
import ru.catssoftware.gameserver.templates.chars.L2NpcTemplate;
import ru.catssoftware.tools.random.Rnd;
public abstract class L2Boss extends L2MonsterInstance
{
private static final int BOSS_MAINTENANCE_INTERVAL = 10000;
public static final int BOSS_INTERACTION_DISTANCE = 500;
public L2Boss(int objectId, L2NpcTemplate template)
{
super(objectId, template);
}
private BossSpawnManager.StatusEnum _raidStatus;
public BossLair _lair;
@Override
protected int getMaintenanceInterval()
{
return BOSS_MAINTENANCE_INTERVAL;
}
@Override
public boolean doDie(L2Character killer)
{
if (!super.doDie(killer))
return false;
L2PcInstance player = killer.getPlayer();
if (player != null)
{
broadcastPacket(new SystemMessage(SystemMessageId.RAID_WAS_SUCCESSFUL));
if (player.getParty() != null)
{
for (L2PcInstance member : player.getParty().getPartyMembers())
rewardRaidPoints(member);
}
else
rewardRaidPoints(player);
}
if(_lair!=null)
_lair.setUnspawn();
return true;
}
private void rewardRaidPoints(L2PcInstance player)
{
int points = (getLevel() / 2) + Rnd.get(-5, 5);
RaidPointsManager.addPoints(player, getNpcId(), points);
SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S1_RAID_POINTS);
sm.addNumber(points);
player.sendPacket(sm);
}
@Override
public boolean hasRandomAnimation()
{
return false;
}
@Override
protected boolean canInteract(L2PcInstance player)
{
return isInsideRadius(player, BOSS_INTERACTION_DISTANCE, false, false);
}
public void setRaidStatus(BossSpawnManager.StatusEnum status)
{
_raidStatus = status;
}
public BossSpawnManager.StatusEnum getRaidStatus()
{
return _raidStatus;
}
/**
* Спавн всех миньенов босса
* Если миньен не около босса, то возвращаем его к боссу
*/
@Override
protected void manageMinions()
{
_minionList.spawnMinions();
_minionMaintainTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
{
public void run()
{
L2Spawn bossSpawn = getSpawn();
if (!isInsideRadius(bossSpawn.getLocx(), bossSpawn.getLocy(), bossSpawn.getLocz(), 5000, true, false))
{
teleToLocation(bossSpawn.getLocx(), bossSpawn.getLocy(), bossSpawn.getLocz(), true);
healFull();
}
_minionList.maintainMinions();
}
}, 60000, getMaintenanceInterval() + Rnd.get(5000));
}
@Override
public void reduceCurrentHp(double damage, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
{
super.reduceCurrentHp(damage, attacker, awake, isDOT, skill);
}
public void healFull()
{
super.getStatus().setCurrentHp(super.getMaxHp());
super.getStatus().setCurrentMp(super.getMaxMp());
}
@Override
public boolean isBoss()
{
return true;
}
@Override
public L2Boss getBoss()
{
return this;
}
}
Новичкам я бы не советовал к релизу эвентов вообще приближаться. Для начала на простых скриптах нужно скилл набивать.А вообще насколько реально новичку реализовать свой евент? (например батлрояль в отзеркаленных катакомбах с рандомящимися скиллами)
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?