/*
* 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 handlers.admincommandhandlers;
import com.l2jserver.gameserver.data.xml.impl.NpcData;
import com.l2jserver.gameserver.handler.IAdminCommandHandler;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.MobGroup;
import com.l2jserver.gameserver.model.MobGroupTable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
import com.l2jserver.gameserver.network.serverpackets.SetupGauge;
import com.l2jserver.gameserver.util.Broadcast;
/**
* @author littlecrow Admin commands handler for controllable mobs
*/
public class AdminMobGroup implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
"admin_mobmenu",
"admin_mobgroup_list",
"admin_mobgroup_create",
"admin_mobgroup_remove",
"admin_mobgroup_delete",
"admin_mobgroup_spawn",
"admin_mobgroup_unspawn",
"admin_mobgroup_kill",
"admin_mobgroup_idle",
"admin_mobgroup_attack",
"admin_mobgroup_rnd",
"admin_mobgroup_return",
"admin_mobgroup_follow",
"admin_mobgroup_casting",
"admin_mobgroup_nomove",
"admin_mobgroup_attackgrp",
"admin_mobgroup_invul"
};
@Override
public boolean useAdminCommand(String command, L2PcInstance activeChar)
{
if (command.equals("admin_mobmenu"))
{
showMainPage(activeChar, command);
return true;
}
else if (command.equals("admin_mobgroup_list"))
{
showGroupList(activeChar);
}
else if (command.startsWith("admin_mobgroup_create"))
{
createGroup(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_delete") || command.startsWith("admin_mobgroup_remove"))
{
removeGroup(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_spawn"))
{
spawnGroup(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_unspawn"))
{
unspawnGroup(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_kill"))
{
killGroup(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_attackgrp"))
{
attackGrp(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_attack"))
{
if (activeChar.getTarget() instanceof L2Character)
{
L2Character target = (L2Character) activeChar.getTarget();
attack(command, activeChar, target);
}
}
else if (command.startsWith("admin_mobgroup_rnd"))
{
setNormal(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_idle"))
{
idle(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_return"))
{
returnToChar(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_follow"))
{
follow(command, activeChar, activeChar);
}
else if (command.startsWith("admin_mobgroup_casting"))
{
setCasting(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_nomove"))
{
noMove(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_invul"))
{
invul(command, activeChar);
}
else if (command.startsWith("admin_mobgroup_teleport"))
{
teleportGroup(command, activeChar);
}
showMainPage(activeChar, command);
return true;
}
/**
* @param activeChar
* @param command
*/
private void showMainPage(L2PcInstance activeChar, String command)
{
String filename = "mobgroup.htm";
AdminHtml.showAdminHtml(activeChar, filename);
}
private void returnToChar(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Incorrect command arguments.");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.returnGroup(activeChar);
}
private void idle(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Incorrect command arguments.");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.setIdleMode();
}
private void setNormal(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Incorrect command arguments.");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.setAttackRandom();
}
private void attack(String command, L2PcInstance activeChar, L2Character target)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Incorrect command arguments.");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.setAttackTarget(target);
}
private void follow(String command, L2PcInstance activeChar, L2Character target)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Incorrect command arguments.");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.setFollowMode(target);
}
private void createGroup(String command, L2PcInstance activeChar)
{
int groupId;
int templateId;
int mobCount;
try
{
String[] cmdParams = command.split(" ");
groupId = Integer.parseInt(cmdParams[1]);
templateId = Integer.parseInt(cmdParams[2]);
mobCount = Integer.parseInt(cmdParams[3]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_create ");
return;
}
if (MobGroupTable.getInstance().getGroup(groupId) != null)
{
activeChar.sendMessage("Mob group " + groupId + " already exists.");
return;
}
L2NpcTemplate template = NpcData.getInstance().getTemplate(templateId);
if (template == null)
{
activeChar.sendMessage("Invalid NPC ID specified.");
return;
}
MobGroup group = new MobGroup(groupId, template, mobCount);
MobGroupTable.getInstance().addGroup(groupId, group);
activeChar.sendMessage("Mob group " + groupId + " created.");
}
private void removeGroup(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_remove ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
doAnimation(activeChar);
group.unspawnGroup();
if (MobGroupTable.getInstance().removeGroup(groupId))
{
activeChar.sendMessage("Mob group " + groupId + " unspawned and removed.");
}
}
private void spawnGroup(String command, L2PcInstance activeChar)
{
int groupId;
boolean topos = false;
int posx = 0;
int posy = 0;
int posz = 0;
try
{
String[] cmdParams = command.split(" ");
groupId = Integer.parseInt(cmdParams[1]);
try
{ // we try to get a position
posx = Integer.parseInt(cmdParams[2]);
posy = Integer.parseInt(cmdParams[3]);
posz = Integer.parseInt(cmdParams[4]);
topos = true;
}
catch (Exception e)
{
// no position given
}
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_spawn [ x y z ]");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
doAnimation(activeChar);
if (topos)
{
group.spawnGroup(posx, posy, posz);
}
else
{
group.spawnGroup(activeChar);
}
activeChar.sendMessage("Mob group " + groupId + " spawned.");
}
private void unspawnGroup(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_unspawn ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
doAnimation(activeChar);
group.unspawnGroup();
activeChar.sendMessage("Mob group " + groupId + " unspawned.");
}
private void killGroup(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_kill ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
doAnimation(activeChar);
group.killGroup(activeChar);
}
private void setCasting(String command, L2PcInstance activeChar)
{
int groupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_casting ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.setCastMode();
}
private void noMove(String command, L2PcInstance activeChar)
{
int groupId;
String enabled;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
enabled = command.split(" ")[2];
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_nomove ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
if (enabled.equalsIgnoreCase("on") || enabled.equalsIgnoreCase("true"))
{
group.setNoMoveMode(true);
}
else if (enabled.equalsIgnoreCase("off") || enabled.equalsIgnoreCase("false"))
{
group.setNoMoveMode(false);
}
else
{
activeChar.sendMessage("Incorrect command arguments.");
}
}
private void doAnimation(L2PcInstance activeChar)
{
Broadcast.toSelfAndKnownPlayersInRadius(activeChar, new MagicSkillUse(activeChar, 1008, 1, 4000, 0), 1500);
activeChar.sendPacket(new SetupGauge(0, 4000));
}
private void attackGrp(String command, L2PcInstance activeChar)
{
int groupId;
int othGroupId;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
othGroupId = Integer.parseInt(command.split(" ")[2]);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_attackgrp ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
MobGroup othGroup = MobGroupTable.getInstance().getGroup(othGroupId);
if (othGroup == null)
{
activeChar.sendMessage("Incorrect target group.");
return;
}
group.setAttackGroup(othGroup);
}
private void invul(String command, L2PcInstance activeChar)
{
int groupId;
String enabled;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
enabled = command.split(" ")[2];
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_invul ");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
if (enabled.equalsIgnoreCase("on") || enabled.equalsIgnoreCase("true"))
{
group.setInvul(true);
}
else if (enabled.equalsIgnoreCase("off") || enabled.equalsIgnoreCase("false"))
{
group.setInvul(false);
}
else
{
activeChar.sendMessage("Incorrect command arguments.");
}
}
private void teleportGroup(String command, L2PcInstance activeChar)
{
int groupId;
String targetPlayerStr = null;
L2PcInstance targetPlayer = null;
try
{
groupId = Integer.parseInt(command.split(" ")[1]);
targetPlayerStr = command.split(" ")[2];
if (targetPlayerStr != null)
{
targetPlayer = L2World.getInstance().getPlayer(targetPlayerStr);
}
if (targetPlayer == null)
{
targetPlayer = activeChar;
}
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //mobgroup_teleport [playerName]");
return;
}
MobGroup group = MobGroupTable.getInstance().getGroup(groupId);
if (group == null)
{
activeChar.sendMessage("Invalid group specified.");
return;
}
group.teleportGroup(activeChar);
}
private void showGroupList(L2PcInstance activeChar)
{
MobGroup[] mobGroupList = MobGroupTable.getInstance().getGroups();
activeChar.sendMessage("======= =======");
for (MobGroup mobGroup : mobGroupList)
{
activeChar.sendMessage(mobGroup.getGroupId() + ": " + mobGroup.getActiveMobCount() + " alive out of " + mobGroup.getMaxMobCount() + " of NPC ID " + mobGroup.getTemplate().getId() + " (" + mobGroup.getStatus() + ")");
}
activeChar.sendPacket(SystemMessageId.FRIEND_LIST_FOOTER);
}
@Override
public String[] getAdminCommandList()
{
return ADMIN_COMMANDS;
}
}