/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L2J DataPack is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package gracia.AI.SeedOfAnnihilation;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import ai.npc.AbstractNpcAI;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.instancemanager.ZoneManager;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.L2ZoneType;
import com.l2jserver.gameserver.model.zone.type.L2EffectZone;
import com.l2jserver.gameserver.util.Util;
/**
* Seed Of Annihilation AI.
* @author Gigiikun
*/
public class SeedOfAnnihilation extends AbstractNpcAI
{
private static final Map TELEPORT_ZONES = new HashMap<>();
private static final int ANNIHILATION_FURNACE = 18928;
// Strength, Agility, Wisdom
private static final int[] ZONE_BUFFS =
{
0,
6443,
6444,
6442
};
//@formatter:off
private static final int[][] ZONE_BUFFS_LIST =
{
{1, 2, 3},
{1, 3, 2},
{2, 1, 3},
{2, 3, 1},
{3, 2, 1},
{3, 1, 2}
};
//@formatter:on
// 0: Bistakon, 1: Reptilikon, 2: Cokrakon
private final SeedRegion[] _regionsData = new SeedRegion[3];
private Long _seedsNextStatusChange;
static
{
TELEPORT_ZONES.put(60002, new Location(-213175, 182648, -10992));
TELEPORT_ZONES.put(60003, new Location(-181217, 186711, -10528));
TELEPORT_ZONES.put(60004, new Location(-180211, 182984, -15152));
TELEPORT_ZONES.put(60005, new Location(-179275, 186802, -10720));
}
public SeedOfAnnihilation()
{
super(SeedOfAnnihilation.class.getSimpleName(), "gracia/AI");
loadSeedRegionData();
for (int i : TELEPORT_ZONES.keySet())
{
addEnterZoneId(i);
}
for (SeedRegion element : _regionsData)
{
for (int elite_mob_id : element.elite_mob_ids)
{
addSpawnId(elite_mob_id);
}
}
addStartNpc(32739);
addTalkId(32739);
startEffectZonesControl();
}
public void loadSeedRegionData()
{
// Bistakon data
_regionsData[0] = new SeedRegion(new int[]
{
22750,
22751,
22752,
22753
}, new int[][]
{
{
22746,
22746,
22746
},
{
22747,
22747,
22747
},
{
22748,
22748,
22748
},
{
22749,
22749,
22749
}
}, 60006, new int[][]
{
{
-180450,
185507,
-10544,
11632
},
{
-180005,
185489,
-10544,
11632
}
});
// Reptilikon data
_regionsData[1] = new SeedRegion(new int[]
{
22757,
22758,
22759
}, new int[][]
{
{
22754,
22755,
22756
}
}, 60007, new int[][]
{
{
-179600,
186998,
-10704,
11632
},
{
-179295,
186444,
-10704,
11632
}
});
// Cokrakon data
_regionsData[2] = new SeedRegion(new int[]
{
22763,
22764,
22765
}, new int[][]
{
{
22760,
22760,
22761
},
{
22760,
22760,
22762
},
{
22761,
22761,
22760
},
{
22761,
22761,
22762
},
{
22762,
22762,
22760
},
{
22762,
22762,
22761
}
}, 60008, new int[][]
{
{
-180971,
186361,
-10528,
11632
},
{
-180758,
186739,
-10528,
11632
}
});
int buffsNow = 0;
String var = loadGlobalQuestVar("SeedNextStatusChange");
if (var.equalsIgnoreCase("") || (Long.parseLong(var) < System.currentTimeMillis()))
{
buffsNow = getRandom(ZONE_BUFFS_LIST.length);
saveGlobalQuestVar("SeedBuffsList", String.valueOf(buffsNow));
_seedsNextStatusChange = getNextSeedsStatusChangeTime();
saveGlobalQuestVar("SeedNextStatusChange", String.valueOf(_seedsNextStatusChange));
}
else
{
_seedsNextStatusChange = Long.parseLong(var);
buffsNow = Integer.parseInt(loadGlobalQuestVar("SeedBuffsList"));
}
for (int i = 0; i < _regionsData.length; i++)
{
_regionsData[i].activeBuff = ZONE_BUFFS_LIST[buffsNow][i];
}
}
private Long getNextSeedsStatusChangeTime()
{
Calendar reenter = Calendar.getInstance();
reenter.set(Calendar.SECOND, 0);
reenter.set(Calendar.MINUTE, 0);
reenter.set(Calendar.HOUR_OF_DAY, 13);
reenter.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
if (reenter.getTimeInMillis() <= System.currentTimeMillis())
{
reenter.add(Calendar.DAY_OF_MONTH, 7);
}
return reenter.getTimeInMillis();
}
private void startEffectZonesControl()
{
for (int i = 0; i < _regionsData.length; i++)
{
for (int j = 0; j < _regionsData[i].af_spawns.length; j++)
{
_regionsData[i].af_npcs[j] = addSpawn(ANNIHILATION_FURNACE, _regionsData[i].af_spawns[j][0], _regionsData[i].af_spawns[j][1], _regionsData[i].af_spawns[j][2], _regionsData[i].af_spawns[j][3], false, 0);
_regionsData[i].af_npcs[j].setDisplayEffect(_regionsData[i].activeBuff);
}
ZoneManager.getInstance().getZoneById(_regionsData[i].buff_zone, L2EffectZone.class).addSkill(ZONE_BUFFS[_regionsData[i].activeBuff], 1);
}
startQuestTimer("ChangeSeedsStatus", _seedsNextStatusChange - System.currentTimeMillis(), null, null);
}
private void spawnGroupOfMinion(L2MonsterInstance npc, int[] mobIds)
{
for (int mobId : mobIds)
{
addMinion(npc, mobId);
}
}
@Override
public String onSpawn(L2Npc npc)
{
for (SeedRegion element : _regionsData)
{
if (Util.contains(element.elite_mob_ids, npc.getId()))
{
spawnGroupOfMinion((L2MonsterInstance) npc, element.minion_lists[getRandom(element.minion_lists.length)]);
}
}
return super.onSpawn(npc);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (event.equalsIgnoreCase("ChangeSeedsStatus"))
{
int buffsNow = getRandom(ZONE_BUFFS_LIST.length);
saveGlobalQuestVar("SeedBuffsList", String.valueOf(buffsNow));
_seedsNextStatusChange = getNextSeedsStatusChangeTime();
saveGlobalQuestVar("SeedNextStatusChange", String.valueOf(_seedsNextStatusChange));
for (int i = 0; i < _regionsData.length; i++)
{
_regionsData[i].activeBuff = ZONE_BUFFS_LIST[buffsNow][i];
for (L2Npc af : _regionsData[i].af_npcs)
{
af.setDisplayEffect(_regionsData[i].activeBuff);
}
L2EffectZone zone = ZoneManager.getInstance().getZoneById(_regionsData[i].buff_zone, L2EffectZone.class);
zone.clearSkills();
zone.addSkill(ZONE_BUFFS[_regionsData[i].activeBuff], 1);
}
startQuestTimer("ChangeSeedsStatus", _seedsNextStatusChange - System.currentTimeMillis(), null, null);
}
else if (event.equalsIgnoreCase("transform"))
{
if (player.isAffectedBySkill(6408))
{
npc.showChatWindow(player, 2);
}
else
{
npc.setTarget(player);
npc.doCast(SkillData.getInstance().getSkill(6408, 1));
npc.doCast(SkillData.getInstance().getSkill(6649, 1));
npc.showChatWindow(player, 1);
}
}
return null;
}
@Override
public String onEnterZone(L2Character character, L2ZoneType zone)
{
if (TELEPORT_ZONES.containsKey(zone.getId()))
{
Location teleLoc = TELEPORT_ZONES.get(zone.getId());
character.teleToLocation(teleLoc, false);
}
return super.onEnterZone(character, zone);
}
private static class SeedRegion
{
public int[] elite_mob_ids;
public int[][] minion_lists;
public int buff_zone;
public int[][] af_spawns;
public L2Npc[] af_npcs = new L2Npc[2];
public int activeBuff = 0;
public SeedRegion(int[] emi, int[][] ml, int bz, int[][] as)
{
elite_mob_ids = emi;
minion_lists = ml;
buff_zone = bz;
af_spawns = as;
}
}
}