Изгнанные
Регистрация: 15.11.2010
Адрес: Омск
Возраст: 32
Сообщений: 89
Отблагодарили 16 раз(а)
Рейтинг мнений:
|
Белеф
можно говорить спасибо и ставить ++++
PHP код:
package ai;
import bosses.BelethManager;
import l2open.gameserver.ai.DefaultAI;
import l2open.gameserver.model.L2Character;
import l2open.gameserver.model.L2Skill;
import l2open.gameserver.model.L2Skill.SkillType;
import l2open.gameserver.model.instances.L2NpcInstance;
import l2open.gameserver.tables.SkillTable;
import l2open.util.Rnd;
import l2open.util.Util;
/**
*
* @author 3JIO
* AI для белефа и компании
*/
public class Beleth extends DefaultAI {
private final L2Skill Bleed = SkillTable.getInstance().getInfo(5495, 1);
private final L2Skill HornOfRising = SkillTable.getInstance().getInfo(5497, 1);
private static final L2Skill Fireball = SkillTable.getInstance().getInfo(5496, 1);
public Beleth(L2Character actor) {
super(actor);
AI_TASK_DELAY = 1000;
AI_TASK_ACTIVE_DELAY = 1000;
}
@Override
public boolean isGlobalAI() {
return true;
}
@Override
protected boolean createNewTask() {
L2NpcInstance actor = getActor();
if (actor == null) {
return true;
}
if (!BelethManager.getZone().checkIfInZone(actor)) {
teleportHome(true);
return false;
}
clearTasks();
L2Character target;
if ((target = prepareTarget()) == null) {
return false;
}
if (!BelethManager.getZone().checkIfInZone(target)) {
target.removeFromHatelist(actor, false);
return false;
}
if(Rnd.chance(40) && !actor.isCastingNow() && Util.checkIfInRange(600, actor, target, false))
{
addTaskCast(target, Fireball);
}
return true;
}
/** если видит хилл скил
* @param skill
* @param caster
*/
@Override
protected void onEvtSeeSpell(L2Skill skill, L2Character caster) {
L2NpcInstance npc = getActor();
if (npc != null && !npc.isDead() && (npc.getNpcId() == 29118 || npc.getNpcId() == 29119) && !npc.isCastingNow() && skill.getSkillType() == SkillType.HEAL && Rnd.get(100) < 80 && Util.checkIfInRange(600, npc, caster, false)) {
clearTasks();
addTaskCast(caster, HornOfRising);
//npc.setTarget(caster);
//npc.doCast(HornOfRising, caster, true);
}
}
@Override
public void onEvtAttacked(L2Character attacker, int damage) {
BelethManager.setLastAttackTime();
if (getActor().getNpcId() == 29118 || getActor().getNpcId() == 29119) {
BelethManager.onAttack(getActor(), attacker);
return;
}
super.onEvtAttacked(attacker, damage);
}
@Override
public void checkAggression(L2Character target) {
if (getActor().getNpcId() == 29118 || getActor().getNpcId() == 29119) {
BelethManager.onAggroRangeEnter(getActor(), target);
}
super.checkAggression(target);
}
@Override
protected void onEvtSpawn() {
L2NpcInstance actor = getActor();
if (actor.getNpcId() == 29118 || actor.getNpcId() == 29119) {
actor.setRunning();
if (actor.getAroundCharacters(300, 200).size() > 2 && Rnd.get(100) < 60) {
clearTasks();
addTaskCast((L2Character) actor.getTarget(), Bleed);
//actor.doCast(Bleed, (L2Character) actor.getTarget(), true);
}
}
}
@Override
protected boolean maybeMoveToHome() {
L2NpcInstance actor = getActor();
if (actor != null && !BelethManager.getZone().checkIfInZone(actor)) {
teleportHome(true);
}
return false;
}
}
PHP код:
package bosses;
import bosses.EpicBossState.State;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import l2open.common.ThreadPoolManager;
import l2open.extensions.listeners.L2ZoneEnterLeaveListener;
import l2open.extensions.scripts.Functions;
import l2open.extensions.scripts.ScriptFile;
import l2open.gameserver.ai.CtrlIntention;
import l2open.gameserver.instancemanager.ZoneManager;
import l2open.gameserver.model.L2Character;
import l2open.gameserver.model.L2CommandChannel;
import l2open.gameserver.model.L2Object;
import l2open.gameserver.model.L2Party;
import l2open.gameserver.model.L2Player;
import l2open.gameserver.model.L2Skill;
import l2open.gameserver.model.L2Zone;
import l2open.gameserver.model.L2Zone.ZoneType;
import l2open.gameserver.model.instances.L2DoorInstance;
import l2open.gameserver.model.instances.L2NpcInstance;
import l2open.gameserver.serverpackets.CreatureSay;
import l2open.gameserver.serverpackets.L2GameServerPacket;
import l2open.gameserver.serverpackets.MagicSkillUse;
import l2open.gameserver.serverpackets.SocialAction;
import l2open.gameserver.serverpackets.SpecialCamera;
import l2open.gameserver.serverpackets.StaticObject;
import l2open.gameserver.tables.DoorTable;
import l2open.gameserver.tables.NpcTable;
import l2open.gameserver.tables.SkillTable;
import l2open.util.Location;
import l2open.util.Log;
import l2open.util.Rnd;
import l2open.util.Util;
/**
*
* @author 3JIO
*/
public class BelethManager extends Functions implements ScriptFile {
private static EpicBossState _state;
private static L2NpcInstance camera;
private static L2NpcInstance camera2;
private static L2NpcInstance camera3;
private static L2NpcInstance camera4;
private static L2NpcInstance camera6;
private static L2NpcInstance StoneCoffin;
private static L2NpcInstance beleth;
private static L2NpcInstance priest;
private static L2Zone _zone = ZoneManager.getInstance().getZoneById(ZoneType.epic, 702144, false);
private static L2Player belethKiller;
private static boolean debug = true;
private static boolean movie = false;
private static boolean attacked = false;
private static int allowObjectId = 0;
private static int killed = 0;
private static ScheduledFuture<?> spawnTimer = null;
private static ScheduledFuture<?> spawnTask = null;
private static ScheduledFuture<?> sleepTask = null;
private static ArrayList<L2NpcInstance> minions = new ArrayList<L2NpcInstance>();
private static ArrayList<Location> loc_to_res = new ArrayList<Location>();
private static final int BELETH = 29118;
private static final int BELETH_CLONE = 29119;
private static ZoneListener _zoneListener = new ZoneListener();
private static long _lastAttackTime = 0;
private static Location beleth_tp_loc = new Location(12695, 215398, -9454);
private static final L2Skill Bleed = SkillTable.getInstance().getInfo(5495, 1);
private static final L2Skill Fireball = SkillTable.getInstance().getInfo(5496, 1);
private static final L2Skill Lightening = SkillTable.getInstance().getInfo(5499, 1);
private static long respawnInterval = 121 * 60 * 60 * 100; //респ 121 час
public static void init() {
_state = new EpicBossState(BELETH, true);
System.out.println("BelethManager: State of Beleth is " + _state.getState() + ".");
_zone.getListenerEngine().addMethodInvokedListener(_zoneListener);
//_zone.getListenerEngine().addMethodInvokedListener((MethodInvokeListener) _zoneListener);
if (_state.getState() == State.NOTSPAWN) {
System.out.println("BelethManager: Beleth is wait for invaders.");
} else if (_state.getState() == State.INTERVAL) {
Date dt = new Date(_state.getRespawnDate());
System.out.println("BelethManager: Beleth is dead, next respawn date is : " + dt.toString());
}
}
public static void startSpawnTask() {
Log.add("Start Beleth Spawn Task", "EpicBoses");
clearAll();
sleepTask = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(34), debug ? 180000 : 300000);
spawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(1), debug ? 20000 : 300000);
}
public void enterToBeleth() {
L2Player player = getSelfPlayer();
if (!checkConditions(player)) {
return;
}
for (L2Player member : player.getParty().getCommandChannel().getMembers()) {
member.sendActionFailed();
member.teleToLocation(beleth_tp_loc);
if (member.getPet() != null) {
member.getPet().teleToLocation(beleth_tp_loc);
}
}
}
/**
* @param player
* @return if player is qualified to start the raid
*/
private boolean checkConditions(L2Player player) {
if (debug) {
return true;
}
if (_state.getState() == EpicBossState.State.INTERVAL) {
player.sendMessage("Beleth is dead");
return false;
}
if (_state.getState() == State.ALIVE) {
player.sendMessage("Beleth engaged in battle");
}
L2Party party = player.getParty();
if (party == null) {
player.sendMessage("You are not in a party.");
return false;
}
L2CommandChannel channel = party.getCommandChannel();
if (channel == null) {
player.sendMessage("Your party is not in a command channel.");
return false;
}
if ((channel.getChannelLeader() != player)) {
player.sendMessage("Only the leader of the command channel may approach me.");
return false;
}
return true;
}
private static class RunEvent implements Runnable {
private int _taskId = 0;
public RunEvent(int taskId) {
_taskId = taskId;
}
@Override
public void run() {
try {
switch (_taskId) {
case 1:
movie = true;
for (L2Object npc : _zone.getInsideObjectsIncludeZ()) {
if (npc instanceof L2NpcInstance) {
npc.deleteMe();
}
}
_state.setState(State.ALIVE);
_state.update();
if (spawnTask != null) {
spawnTask.cancel(false);
spawnTask = null;
}
camera = spawn(29120, new Location(16323, 213142, -9357));
camera2 = spawn(29121, new Location(16323, 210741, -9357));
camera3 = spawn(29122, new Location(16323, 213170, -9357));
camera4 = spawn(29123, new Location(16323, 214917, -9356));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(2), 300);
break;
case 2:
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 1800, -45, -45, 5000, 5000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(3), 4900);
break;
case 3:
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 2500, -120, -45, 5000, 5000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(4), 4900);
break;
case 4:
sendPacketToInZone(new SpecialCamera(camera2.getObjectId(), 2200, 130, 0, 0, 1500, -20, 15, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(5), 1400);
break;
case 5:
sendPacketToInZone(new SpecialCamera(camera2.getObjectId(), 2300, 100, 0, 2000, 4500, 0, 10, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(6), 2500);
break;
case 6:
L2DoorInstance door = DoorTable.getInstance().getDoor(20240001);
door.closeMe();
sendPacketToInZone(new StaticObject(door));
//sendPacketToInZone(new DoorStatusUpdate(door));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(7), 1700);
break;
case 7:
sendPacketToInZone(new SpecialCamera(camera4.getObjectId(), 1500, 210, 0, 0, 1500, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 5000, 6500, 0, 10, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(8), 6000);
break;
case 8:
camera6 = spawn(29125, new Location(16323, 214917, -9356));
sendPacketToInZone(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 0, 1500, 0, 10, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(9), 1000);
break;
case 9:
sendPacketToInZone(new SpecialCamera(camera4.getObjectId(), 1000, 255, 0, 7000, 17000, 0, 25, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(10), 3000);
break;
case 10:
beleth = spawn(29118, new Location(16321, 214211, -9352));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(11), 200);
break;
case 11:
sendPacketToInZone(new SocialAction(beleth.getObjectId(), 1));
for (int i = 0; i < 6; i++) {
int x = (int) (150 * Math.cos(i * 1.046666667) + 16323);
int y = (int) (150 * Math.sin(i * 1.046666667) + 213059);
L2NpcInstance minion = spawn(29119, new Location(x, y, -9357));
minion.decayMe();
minions.add(minion);
}
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(12), 6800);
break;
case 12:
sendPacketToInZone(new SpecialCamera(beleth.getObjectId(), 0, 270, -5, 0, 4000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(13), 3500);
break;
case 13:
sendPacketToInZone(new SpecialCamera(beleth.getObjectId(), 800, 270, 10, 3000, 6000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(14), 5000);
break;
case 14:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(15), 100);
break;
case 15:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 3000, 6000, 0, 5, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(16), 1400);
break;
case 16:
beleth.teleToLocation(16323, 213059, -9357, 49152);
beleth.setOverloaded(true);
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(17), 200);
break;
case 17:
sendPacketToInZone(new MagicSkillUse(beleth, beleth, 5532, 1, 2000, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(18), 2000);
break;
case 18:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 700, 270, 20, 1500, 8000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(19), 6900);
break;
case 19:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 40, 260, 0, 0, 4000, 0, 0, 1, 0));
for (L2NpcInstance blth : minions) {
blth.spawnMe();
}
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(20), 3000);
break;
case 20:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 40, 280, 0, 0, 4000, 5, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(21), 3000);
break;
case 21:
sendPacketToInZone(new SpecialCamera(camera3.getObjectId(), 5, 250, 5, 0, 13000, 20, 15, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(22), 1000);
break;
case 22:
sendPacketToInZone(new SocialAction(beleth.getObjectId(), 3));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(23), 4000);
break;
case 23:
sendPacketToInZone(new MagicSkillUse(beleth, beleth, 5533, 1, 2000, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(24), 6800);
break;
case 24:
beleth.deleteMe();
for (L2NpcInstance bel : minions) {
bel.deleteMe();
}
minions.clear();
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(25), 1000);
break;
case 25:
camera.deleteMe();
camera2.deleteMe();
camera3.deleteMe();
camera4.deleteMe();
movie = false;
spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(26), 1000);
break;
case 26:
if (spawnTimer != null) {
spawnTimer.cancel(false);
spawnTimer = null;
}
SpawnBeleths();
break;
case 27:
beleth.doDie(belethKiller);
if (sleepTask != null) {
sleepTask.cancel(false);
sleepTask = null;
}
camera = spawn(29122, new Location(16323, 213170, -9357));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 110, 25, 4000, 10000, 0, 0, 1, 0));
sendPacketToInZone(new SocialAction(beleth.getObjectId(), 5));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(28), 4000);
break;
case 28:
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 295, 25, 4000, 5000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(29), 4500);
break;
case 29:
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 400, 295, 10, 4000, 11000, 0, 25, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(30), 9000);
break;
case 30:
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 1000, 0, 0, 1, 0));
sendPacketToInZone(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 10000, 0, 0, 1, 0));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(31), 2000);
break;
case 31:
priest.spawnMe();
beleth.deleteMe();
camera2 = spawn(29121, new Location(14056, 213170, -9357));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(32), 3500);
break;
case 32:
sendPacketToInZone(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
sendPacketToInZone(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
L2DoorInstance door2 = DoorTable.getInstance().getDoor(20240002);
door2.openMe();
sendPacketToInZone(new StaticObject(door2));
//sendPacketToInZone(new DoorStatusUpdate(door2));
DoorTable.getInstance().getDoor(20240003).openMe();
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(33), 4000);
break;
case 33:
camera.deleteMe();
camera2.deleteMe();
movie = false;
break;
case 333:
beleth = spawn(29118, new Location(16323, 213170, -9357));
break;
case 34: // if beleth and clones not attacked 5 min unspawn and set to not spawned
Log.add("Beleth is fail", "EpicBosses");
if (getLastAttackTime() + 300000 < System.currentTimeMillis() && _state.getState().equals(State.ALIVE)) {
deleteAll();
clearAll();
_state.setState(State.NOTSPAWN);
_state.update();
break;
}
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(34), 300000);
break;
case 36: //respawn clones
if (_state.getState() == State.ALIVE) {
respawnClones();
}
if (spawnTimer != null) {
spawnTimer.cancel(false);
spawnTimer = null;
}
spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(36), 60000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Слушатель входа в зону Белефа
private static class ZoneListener extends PlayerChangedZonesListener {
@SuppressWarnings("unchecked")
@Override
public ListenerInvocationResult objectEntered(L2Zone zone, L2Object object) {
if (spawnTask == null && _state.getState() == EpicBossState.State.NOTSPAWN) {
startSpawnTask();
}
return new ListenerInvocationResult(ListenerInvocationResult.Action.CONTINUE);
}
}*/
private static class ZoneListener extends L2ZoneEnterLeaveListener {
@SuppressWarnings("null")
@Override
public void objectEntered(L2Zone zone, L2Object object) {
if (object == null && !object.isPlayable()) {
return;
}
if (spawnTask == null && _state.getState() == EpicBossState.State.NOTSPAWN) {
startSpawnTask();
}
}
@Override
public void objectLeaved(L2Zone zone, L2Object object) {
}
}
public static void OnDie(L2Character self, L2Character killer) {
if (self == null) {
return;
}
if (self.isNpc() && self.getNpcId() == BELETH) {
//Белеф умер
L2Player player = killer.getPlayer();
if (player.getParty() != null) {
if (player.getParty().getCommandChannel() != null) {
belethKiller = player.getParty().getCommandChannel().getChannelLeader();
} else {
belethKiller = player.getParty().getPartyLeader();
}
} else {
belethKiller = player;
}
_state.setRespawnDate(debug ? 100000 : respawnInterval);
_state.setState(EpicBossState.State.INTERVAL);
_state.update();
Log.add("Beleth died", "EpicBosses");
deleteAll();
self.deleteMe();
movie = true;
beleth = spawn(BELETH, new Location(16323, 213170, -9357));
beleth.setIsInvul(true);
beleth.setImobilised(true);
priest = spawn(29128, new Location(beleth.getX(), beleth.getY(), beleth.getZ()));
priest.decayMe();
StoneCoffin = spawn(32470, new Location(12470, 215607, -9381));
ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(27), 1000);
} else if (self.isNpc() && self.getNpcId() == BELETH_CLONE) {
loc_to_res.add(((L2NpcInstance) self).getSpawnedLoc());
clone_killed++;
//Умер клон белефа
if (self.getObjectId() == allowObjectId) {
minions.remove((L2NpcInstance) self);
killed++;
if (killed >= 5) {
deleteAll();
spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(333), 60000);
} else {
allowObjectId = minions.get(Rnd.get(minions.size() - 1)).getObjectId();
attacked = false;
}
} else if (spawnTimer == null) {
spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new RunEvent(36), 60000);
} else {
ThreadPoolManager.getInstance().scheduleGeneral(new cloneResp(((L2NpcInstance) self).getSpawnedLoc()), 60000);
minions.remove((L2NpcInstance) self);
}
self.abortCast(true);
self.setTarget(null);
self.deleteMe();
}
}
private static class cloneResp implements Runnable {
private Location loc;
public cloneResp(Location _loc) {
loc = _loc;
}
@Override
public void run() {
if (_state.getState() == State.ALIVE) {
L2NpcInstance npc = spawn(BELETH_CLONE, loc);
minions.add(npc);
}
}
}
private static int clone_killed = 0;
private static void respawnClones() {
System.out.println("try respawn beleth clones");
clone_killed = 0;
for (Location loc : loc_to_res) {
L2NpcInstance npc = spawn(BELETH_CLONE, loc);
minions.add(npc);
}
loc_to_res.clear();
}
public static void onAttack(L2NpcInstance npc, L2Character attacker) {
if (npc.getObjectId() == allowObjectId && !attacked) {
attacked = true;
L2NpcInstance fakeBeleth = null;
for (L2NpcInstance tmp : minions) {
if (tmp.getObjectId() == allowObjectId) {
fakeBeleth = tmp;
}
}
if (fakeBeleth != null) {
sendPacketToInZone(new CreatureSay(fakeBeleth.getObjectId(), 0, fakeBeleth.getName(), "You all die"));
}
if (Rnd.chance(40)) {
return;
}
final double distance = npc.getDistance(attacker);
if (distance > 500 || Rnd.chance(80)) {
for (L2NpcInstance blt : minions) {
if (blt != null && !blt.isDead() && Util.checkIfInRange(900, blt, attacker, false) && !blt.isCastingNow()) {
blt.setTarget(attacker);
blt.doCast(Fireball, attacker, true);
}
}
if (beleth != null && !beleth.isDead() && Util.checkIfInRange(900, beleth, attacker, false) && !beleth.isCastingNow()) {
beleth.setTarget(attacker);
beleth.doCast(Fireball, attacker, true);
}
} else if (!npc.isDead() && !npc.isCastingNow()) {
if (npc.getAroundCharacters(200, 200).size() > 2) {
npc.doCast(Lightening, attacker, true);
return;
}
npc.clearAggroList(false);
}
} else {
if (!npc.isDead() && !npc.isCastingNow() && Util.checkIfInRange(900, npc, attacker, false)) {
npc.setTarget(attacker);
npc.doCast(Fireball, attacker, true);
}
}
}
public static void onAggroRangeEnter(L2NpcInstance actor, L2Character target) {
if (actor == null || actor.isCastingNow()) {
return;
}
if (Rnd.get(100) < 40) {
if (actor.getAroundCharacters(200, 200).size() > 2) {
actor.doCast(Bleed, target, true);
return;
}
}
if (Util.checkIfInRange(900, actor, target, false)) {
actor.setTarget(target);
actor.doCast(Fireball, target, true);
}
}
/** Спавнит клонов белефа*/
private static void SpawnBeleths() {
int a = 0;
L2NpcInstance npc;
for (int i = 0; i < 16; i++) {
a++;
int x = (int) (650 * Math.cos(i * 0.39) + 16323);
int y = (int) (650 * Math.sin(i * 0.39) + 213170);
npc = spawn(BELETH_CLONE, new Location(x, y, -9357));
minions.add(npc);
if (a >= 2) {
npc.setOverloaded(true);
a = 0;
}
}
int[] xm = new int[16];
int[] ym = new int[16];
for (int i = 0; i < 4; i++) {
xm[i] = (int) (1700 * Math.cos(i * 1.57 + 0.78) + 16323);
ym[i] = (int) (1700 * Math.sin(i * 1.57 + 0.78) + 213170);
npc = spawn(BELETH_CLONE, new Location(xm[i], ym[i], -9357));
npc.setOverloaded(true);
minions.add(npc);
}
xm[4] = (xm[0] + xm[1]) / 2;
ym[4] = (ym[0] + ym[1]) / 2;
npc = spawn(BELETH_CLONE, new Location(xm[4], ym[4], -9357));
npc.setOverloaded(true);
minions.add(npc);
xm[5] = (xm[1] + xm[2]) / 2;
ym[5] = (ym[1] + ym[2]) / 2;
npc = spawn(BELETH_CLONE, new Location(xm[5], ym[5], -9357));
npc.setOverloaded(true);
minions.add(npc);
xm[6] = (xm[2] + xm[3]) / 2;
ym[6] = (ym[2] + ym[3]) / 2;
npc = spawn(BELETH_CLONE, new Location(xm[6], ym[6], -9357));
npc.setOverloaded(true);
minions.add(npc);
xm[7] = (xm[3] + xm[0]) / 2;
ym[7] = (ym[3] + ym[0]) / 2;
npc = spawn(BELETH_CLONE, new Location(xm[7], ym[7], -9357));
npc.setOverloaded(true);
minions.add(npc);
xm[8] = (xm[0] + xm[4]) / 2;
ym[8] = (ym[0] + ym[4]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[8], ym[8], -9357)));
xm[9] = (xm[4] + xm[1]) / 2;
ym[9] = (ym[4] + ym[1]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[9], ym[9], -9357)));
xm[10] = (xm[1] + xm[5]) / 2;
ym[10] = (ym[1] + ym[5]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[10], ym[10], -9357)));
xm[11] = (xm[5] + xm[2]) / 2;
ym[11] = (ym[5] + ym[2]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[11], ym[11], -9357)));
xm[12] = (xm[2] + xm[6]) / 2;
ym[12] = (ym[2] + ym[6]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[12], ym[12], -9357)));
xm[13] = (xm[6] + xm[3]) / 2;
ym[13] = (ym[6] + ym[3]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[13], ym[13], -9357)));
xm[14] = (xm[3] + xm[7]) / 2;
ym[14] = (ym[3] + ym[7]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[14], ym[14], -9357)));
xm[15] = (xm[7] + xm[0]) / 2;
ym[15] = (ym[7] + ym[0]) / 2;
minions.add(spawn(BELETH_CLONE, new Location(xm[15], ym[15], -9357)));
allowObjectId = minions.get(Rnd.get(minions.size() - 1)).getObjectId();
attacked = false;
}
private static L2NpcInstance spawn(int npcId, Location loc) {
try {
L2NpcInstance npc = NpcTable.getTemplate(npcId).getNewInstance();
npc.setSpawnedLoc(loc.correctGeoZ());
npc.onSpawn();
npc.getSpawn().stopRespawn();
npc.spawnMe(npc.getSpawnedLoc());
return npc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void setLastAttackTime() {
System.out.println("omg beleth or his clone attacked");
_lastAttackTime = System.currentTimeMillis();
}
public static long getLastAttackTime() {
return _lastAttackTime;
}
public static int getAllowObjectId() {
return allowObjectId;
}
private static void sendPacketToInZone(L2GameServerPacket packet) {
for (L2Player player : _zone.getInsidePlayers()) {
player.sendPacket(packet);
}
}
/** удаляет всех клонов */
private static void deleteAll() {
if (minions != null && !minions.isEmpty()) {
for (L2NpcInstance npc : minions) {
if (npc == null || npc.isDead()) {
continue;
}
npc.sendActionFailed();
npc.setTarget(null);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
npc.deleteMe();
}
}
minions.clear();
allowObjectId = 0;
attacked = false;
}
//чистим все перед входом к белефу
//на всякий случай
private static void clearAll() {
for (L2Object obj : _zone.getInsideObjectsIncludeZ()) {
if (obj instanceof L2NpcInstance) {
obj.deleteMe();
obj = null;
}
}
killed = 0;
allowObjectId = 0;
belethKiller = null;
movie = false;
}
public static L2Zone getZone() {
return _zone;
}
@Override
public void onLoad() {
init();
}
@Override
public void onReload() {
_zone.getListenerEngine().removeMethodInvokedListener(_zoneListener);
}
@Override
public void onShutdown() {
}
}
PHP код:
<zone id="702144" name="[LairOfBeleth]" type="epic">
<shape>
<coords loc="17139 208772 -10000 -5000" />
<coords loc="15530 208748 -10000 -5000" />
<coords loc="14243 212199 -10000 -5000" />
<coords loc="12349 213004 -10000 -5000" />
<coords loc="11637 215088 -10000 -5000" />
<coords loc="11628 216101 -10000 -5000" />
<coords loc="11952 216445 -10000 -5000" />
<coords loc="12967 216450 -10000 -5000" />
<coords loc="15021 214833 -10000 -5000" />
<coords loc="15450 215287 -10000 -5000" />
<coords loc="15435 216243 -10000 -5000" />
<coords loc="15661 216701 -10000 -5000" />
<coords loc="16319 216691 -10000 -5000" />
<coords loc="16998 216696 -10000 -5000" />
<coords loc="17289 215186 -10000 -5000" />
<coords loc="18368 214068 -10000 -5000" />
<coords loc="18432 212343 -10000 -5000" />
<coords loc="17288 211074 -10000 -5000" />
</shape>
</zone>
Добавлено через 5 часов 24 минуты
выложил свою работу может кому пригодиться
Последний раз редактировалось 3JIO; 16.10.2011 в 16:58.
Причина: Добавлено сообщение
|