Merged with released L2J-Unity files.
This commit is contained in:
@@ -1,162 +1,310 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.admincommandhandlers;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import com.l2jmobius.gameserver.handler.IAdminCommandHandler;
|
||||
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||
import com.l2jmobius.gameserver.model.L2Object;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Summon;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.entity.Instance;
|
||||
|
||||
/**
|
||||
* @author evill33t, GodKratos
|
||||
*/
|
||||
public class AdminInstance implements IAdminCommandHandler
|
||||
{
|
||||
private static final String[] ADMIN_COMMANDS =
|
||||
{
|
||||
"admin_setinstance",
|
||||
"admin_ghoston",
|
||||
"admin_ghostoff",
|
||||
"admin_createinstance",
|
||||
"admin_destroyinstance",
|
||||
"admin_listinstances"
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean useAdminCommand(String command, L2PcInstance activeChar)
|
||||
{
|
||||
final StringTokenizer st = new StringTokenizer(command);
|
||||
st.nextToken();
|
||||
|
||||
// create new instance
|
||||
if (command.startsWith("admin_createinstance"))
|
||||
{
|
||||
final String[] parts = command.split(" ");
|
||||
if (parts.length != 3)
|
||||
{
|
||||
activeChar.sendMessage("Example: //createinstance <id> <templatefile> - ids => 300000 are reserved for dynamic instances");
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
final int id = Integer.parseInt(parts[1]);
|
||||
if ((id < 300000) && InstanceManager.getInstance().createInstanceFromTemplate(id, parts[2]))
|
||||
{
|
||||
activeChar.sendMessage("Instance created.");
|
||||
}
|
||||
else
|
||||
{
|
||||
activeChar.sendMessage("Failed to create instance.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activeChar.sendMessage("Failed loading: " + parts[1] + " " + parts[2]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_listinstances"))
|
||||
{
|
||||
for (Instance temp : InstanceManager.getInstance().getInstances().values())
|
||||
{
|
||||
activeChar.sendMessage("Id: " + temp.getId() + " Name: " + temp.getName());
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_setinstance"))
|
||||
{
|
||||
try
|
||||
{
|
||||
final int val = Integer.parseInt(st.nextToken());
|
||||
if (InstanceManager.getInstance().getInstance(val) == null)
|
||||
{
|
||||
activeChar.sendMessage("Instance " + val + " doesnt exist.");
|
||||
return false;
|
||||
}
|
||||
|
||||
final L2Object target = activeChar.getTarget();
|
||||
if ((target == null) || (target instanceof L2Summon)) // Don't separate summons from masters
|
||||
{
|
||||
activeChar.sendMessage("Incorrect target.");
|
||||
return false;
|
||||
}
|
||||
target.setInstanceId(val);
|
||||
if (target instanceof L2PcInstance)
|
||||
{
|
||||
final L2PcInstance player = (L2PcInstance) target;
|
||||
player.sendMessage("Admin set your instance to:" + val);
|
||||
player.teleToLocation(player.getLocation());
|
||||
}
|
||||
activeChar.sendMessage("Moved " + target.getName() + " to instance " + target.getInstanceId() + ".");
|
||||
return true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activeChar.sendMessage("Use //setinstance id");
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_destroyinstance"))
|
||||
{
|
||||
try
|
||||
{
|
||||
final int val = Integer.parseInt(st.nextToken());
|
||||
InstanceManager.getInstance().destroyInstance(val);
|
||||
activeChar.sendMessage("Instance destroyed");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activeChar.sendMessage("Use //destroyinstance id");
|
||||
}
|
||||
}
|
||||
|
||||
// set ghost mode on aka not appearing on any knownlist
|
||||
// you will be invis to all players but you also dont get update packets ;)
|
||||
// you will see snapshots (knownlist echoes?) if you port
|
||||
// so kinda useless atm
|
||||
// TODO: enable broadcast packets for ghosts
|
||||
else if (command.startsWith("admin_ghoston"))
|
||||
{
|
||||
activeChar.getAppearance().setGhostMode(true);
|
||||
activeChar.sendMessage("Ghost mode enabled");
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.decayMe();
|
||||
activeChar.spawnMe();
|
||||
}
|
||||
// ghost mode off
|
||||
else if (command.startsWith("admin_ghostoff"))
|
||||
{
|
||||
activeChar.getAppearance().setGhostMode(false);
|
||||
activeChar.sendMessage("Ghost mode disabled");
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.decayMe();
|
||||
activeChar.spawnMe();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getAdminCommandList()
|
||||
{
|
||||
return ADMIN_COMMANDS;
|
||||
}
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This program 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package handlers.admincommandhandlers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.l2jmobius.commons.util.CommonUtil;
|
||||
import com.l2jmobius.gameserver.handler.IAdminCommandHandler;
|
||||
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.html.PageBuilder;
|
||||
import com.l2jmobius.gameserver.model.html.PageResult;
|
||||
import com.l2jmobius.gameserver.model.html.formatters.BypassParserFormatter;
|
||||
import com.l2jmobius.gameserver.model.html.pagehandlers.NextPrevPageHandler;
|
||||
import com.l2jmobius.gameserver.model.html.styles.ButtonsStyle;
|
||||
import com.l2jmobius.gameserver.model.instancezone.Instance;
|
||||
import com.l2jmobius.gameserver.model.instancezone.InstanceTemplate;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
import com.l2jmobius.gameserver.util.BypassParser;
|
||||
|
||||
/**
|
||||
* Instance admin commands.
|
||||
* @author St3eT
|
||||
*/
|
||||
public final class AdminInstance implements IAdminCommandHandler
|
||||
{
|
||||
private static final String[] ADMIN_COMMANDS =
|
||||
{
|
||||
"admin_instance",
|
||||
"admin_instances",
|
||||
"admin_instancelist",
|
||||
"admin_instancecreate",
|
||||
"admin_instanceteleport",
|
||||
"admin_instancedestroy",
|
||||
};
|
||||
private static final int[] IGNORED_TEMPLATES =
|
||||
{
|
||||
127, // Chamber of Delusion
|
||||
128, // Chamber of Delusion
|
||||
129, // Chamber of Delusion
|
||||
130, // Chamber of Delusion
|
||||
131, // Chamber of Delusion
|
||||
132, // Chamber of Delusion
|
||||
147, // Grassy Arena
|
||||
149, // Heros's Vestiges Arena
|
||||
150, // Orbis Arena
|
||||
148, // Three Bridges Arena
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean useAdminCommand(String command, L2PcInstance activeChar)
|
||||
{
|
||||
final StringTokenizer st = new StringTokenizer(command, " ");
|
||||
final String actualCommand = st.nextToken();
|
||||
|
||||
switch (actualCommand.toLowerCase())
|
||||
{
|
||||
case "admin_instance":
|
||||
case "admin_instances":
|
||||
{
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
|
||||
html.setFile(activeChar.getHtmlPrefix(), "data/html/admin/instances.htm");
|
||||
html.replace("%instCount%", InstanceManager.getInstance().getInstances().size());
|
||||
html.replace("%tempCount%", InstanceManager.getInstance().getInstanceTemplates().size());
|
||||
activeChar.sendPacket(html);
|
||||
break;
|
||||
}
|
||||
case "admin_instancelist":
|
||||
{
|
||||
processBypass(activeChar, new BypassParser(command));
|
||||
break;
|
||||
}
|
||||
case "admin_instancecreate":
|
||||
{
|
||||
final int templateId = CommonUtil.parseNextInt(st, 0);
|
||||
final InstanceTemplate template = InstanceManager.getInstance().getInstanceTemplate(templateId);
|
||||
|
||||
if (template != null)
|
||||
{
|
||||
final String enterGroup = st.hasMoreTokens() ? st.nextToken() : "Alone";
|
||||
final List<L2PcInstance> members = new ArrayList<>();
|
||||
|
||||
switch (enterGroup)
|
||||
{
|
||||
case "Alone":
|
||||
{
|
||||
members.add(activeChar);
|
||||
break;
|
||||
}
|
||||
case "Party":
|
||||
{
|
||||
if (activeChar.isInParty())
|
||||
{
|
||||
members.addAll(activeChar.getParty().getMembers());
|
||||
}
|
||||
else
|
||||
{
|
||||
members.add(activeChar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "CommandChannel":
|
||||
{
|
||||
if (activeChar.isInCommandChannel())
|
||||
{
|
||||
members.addAll(activeChar.getParty().getCommandChannel().getMembers());
|
||||
}
|
||||
else if (activeChar.isInParty())
|
||||
{
|
||||
members.addAll(activeChar.getParty().getMembers());
|
||||
}
|
||||
else
|
||||
{
|
||||
members.add(activeChar);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
activeChar.sendMessage("Wrong enter group usage! Please use those values: Alone, Party or CommandChannel.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
final Instance instance = InstanceManager.getInstance().createInstance(template, activeChar);
|
||||
final Location loc = instance.getEnterLocation();
|
||||
if (loc != null)
|
||||
{
|
||||
for (L2PcInstance players : members)
|
||||
{
|
||||
instance.addAllowed(players);
|
||||
players.teleToLocation(loc, instance);
|
||||
}
|
||||
}
|
||||
sendTemplateDetails(activeChar, instance.getTemplateId());
|
||||
}
|
||||
else
|
||||
{
|
||||
activeChar.sendMessage("Wrong parameters! Please try again.");
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "admin_instanceteleport":
|
||||
{
|
||||
final Instance instance = InstanceManager.getInstance().getInstance(CommonUtil.parseNextInt(st, -1));
|
||||
if (instance != null)
|
||||
{
|
||||
final Location loc = instance.getEnterLocation();
|
||||
if (loc != null)
|
||||
{
|
||||
if (!instance.isAllowed(activeChar))
|
||||
{
|
||||
instance.addAllowed(activeChar);
|
||||
}
|
||||
activeChar.teleToLocation(loc, false);
|
||||
activeChar.setInstance(instance);
|
||||
sendTemplateDetails(activeChar, instance.getTemplateId());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "admin_instancedestroy":
|
||||
{
|
||||
final Instance instance = InstanceManager.getInstance().getInstance(CommonUtil.parseNextInt(st, -1));
|
||||
if (instance != null)
|
||||
{
|
||||
instance.getPlayers().forEach(player -> player.sendPacket(new ExShowScreenMessage("Your instance has been destroyed by Game Master!", 10000)));
|
||||
activeChar.sendMessage("You destroyed Instance " + instance.getId() + " with " + instance.getPlayersCount() + " players inside.");
|
||||
instance.destroy();
|
||||
sendTemplateDetails(activeChar, instance.getTemplateId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendTemplateDetails(L2PcInstance player, int templateId)
|
||||
{
|
||||
if (InstanceManager.getInstance().getInstanceTemplate(templateId) != null)
|
||||
{
|
||||
final InstanceTemplate template = InstanceManager.getInstance().getInstanceTemplate(templateId);
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
html.setFile(player.getHtmlPrefix(), "data/html/admin/instances_detail.htm");
|
||||
html.replace("%templateId%", template.getId());
|
||||
html.replace("%templateName%", template.getName());
|
||||
html.replace("%activeWorlds%", template.getWorldCount() + " / " + (template.getMaxWorlds() == -1 ? "Unlimited" : template.getMaxWorlds()));
|
||||
html.replace("%duration%", template.getDuration() + " minutes");
|
||||
html.replace("%emptyDuration%", TimeUnit.MILLISECONDS.toMinutes(template.getEmptyDestroyTime()) + " minutes");
|
||||
html.replace("%ejectDuration%", template.getEjectTime() + " minutes");
|
||||
html.replace("%removeBuff%", template.isRemoveBuffEnabled());
|
||||
|
||||
sb.append("<table border=0 cellpadding=2 cellspacing=0 bgcolor=\"363636\">");
|
||||
sb.append("<tr>");
|
||||
sb.append("<td fixwidth=\"83\"><font color=\"LEVEL\">Instance ID</font></td>");
|
||||
sb.append("<td fixwidth=\"83\"><font color=\"LEVEL\">Teleport</font></td>");
|
||||
sb.append("<td fixwidth=\"83\"><font color=\"LEVEL\">Destroy</font></td>");
|
||||
sb.append("</tr>");
|
||||
sb.append("</table>");
|
||||
|
||||
InstanceManager.getInstance().getInstances().stream().filter(inst -> (inst.getTemplateId() == templateId)).sorted(Comparator.comparingInt(Instance::getPlayersCount)).forEach(instance ->
|
||||
{
|
||||
sb.append("<table border=0 cellpadding=2 cellspacing=0 bgcolor=\"363636\">");
|
||||
sb.append("<tr>");
|
||||
sb.append("<td fixwidth=\"83\">" + instance.getId() + "</td>");
|
||||
sb.append("<td fixwidth=\"83\"><button value=\"Teleport!\" action=\"bypass -h admin_instanceteleport " + instance.getId() + "\" width=75 height=18 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
|
||||
sb.append("<td fixwidth=\"83\"><button value=\"Destroy!\" action=\"bypass -h admin_instancedestroy " + instance.getId() + "\" width=75 height=18 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
|
||||
sb.append("</tr>");
|
||||
sb.append("</table>");
|
||||
});
|
||||
|
||||
html.replace("%instanceList%", sb.toString());
|
||||
player.sendPacket(html);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.sendMessage("Instance template with id " + templateId + " does not exist!");
|
||||
useAdminCommand("admin_instance", player);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendTemplateList(L2PcInstance player, int page, BypassParser parser)
|
||||
{
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
|
||||
html.setFile(player.getHtmlPrefix(), "data/html/admin/instances_list.htm");
|
||||
|
||||
final InstanceManager instManager = InstanceManager.getInstance();
|
||||
final List<InstanceTemplate> templateList = instManager.getInstanceTemplates().stream().sorted(Comparator.comparingLong(InstanceTemplate::getWorldCount).reversed()).filter(template -> !CommonUtil.contains(IGNORED_TEMPLATES, template.getId())).collect(Collectors.toList());
|
||||
|
||||
//@formatter:off
|
||||
final PageResult result = PageBuilder.newBuilder(templateList, 4, "bypass -h admin_instancelist")
|
||||
.currentPage(page)
|
||||
.pageHandler(NextPrevPageHandler.INSTANCE)
|
||||
.formatter(BypassParserFormatter.INSTANCE)
|
||||
.style(ButtonsStyle.INSTANCE)
|
||||
.bodyHandler((pages, template, sb) ->
|
||||
{
|
||||
sb.append("<table border=0 cellpadding=0 cellspacing=0 bgcolor=\"363636\">");
|
||||
sb.append("<tr><td align=center fixwidth=\"250\"><font color=\"LEVEL\">" + template.getName() + " (" + template.getId() + ")</font></td></tr>");
|
||||
sb.append("</table>");
|
||||
|
||||
sb.append("<table border=0 cellpadding=0 cellspacing=0 bgcolor=\"363636\">");
|
||||
sb.append("<tr>");
|
||||
sb.append("<td align=center fixwidth=\"83\">Active worlds:</td>");
|
||||
sb.append("<td align=center fixwidth=\"83\"></td>");
|
||||
sb.append("<td align=center fixwidth=\"83\">" + template.getWorldCount() + " / " + (template.getMaxWorlds() == -1 ? "Unlimited" : template.getMaxWorlds()) + "</td>");
|
||||
sb.append("</tr>");
|
||||
|
||||
sb.append("<tr>");
|
||||
sb.append("<td align=center fixwidth=\"83\">Detailed info:</td>");
|
||||
sb.append("<td align=center fixwidth=\"83\"></td>");
|
||||
sb.append("<td align=center fixwidth=\"83\"><button value=\"Show me!\" action=\"bypass -h admin_instancelist id=" + template.getId() + "\" width=\"85\" height=\"20\" back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
|
||||
sb.append("</tr>");
|
||||
|
||||
|
||||
sb.append("</table>");
|
||||
sb.append("<br>");
|
||||
}).build();
|
||||
//@formatter:on
|
||||
|
||||
html.replace("%pages%", result.getPages() > 0 ? "<center><table width=\"100%\" cellspacing=0><tr>" + result.getPagerTemplate() + "</tr></table></center>" : "");
|
||||
html.replace("%data%", result.getBodyTemplate().toString());
|
||||
player.sendPacket(html);
|
||||
}
|
||||
|
||||
private void processBypass(L2PcInstance player, BypassParser parser)
|
||||
{
|
||||
final int page = parser.getInt("page", 0);
|
||||
final int templateId = parser.getInt("id", 0);
|
||||
|
||||
if (templateId > 0)
|
||||
{
|
||||
sendTemplateDetails(player, templateId);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
sendTemplateList(player, page, parser);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getAdminCommandList()
|
||||
{
|
||||
return ADMIN_COMMANDS;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user