-
Posts
-
package custom.events.RandomZoneEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledFuture; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.time.SchedulingPattern; import org.l2jmobius.commons.time.TimeUtil; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.managers.ZoneManager; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.quest.Event; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.model.zone.ZoneType; import org.l2jmobius.gameserver.model.zone.type.RandomZone; import org.l2jmobius.gameserver.util.Broadcast; /** * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime. * @author Juan */ public class RandomZoneEvent extends Event { private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml"; private static int EVENT_DURATION_MINUTES = 15; private static boolean _isActive = false; private ScheduledFuture<?> _eventTask = null; private final List<ZoneType> _availableZones = new ArrayList<>(); private ZoneType _activeZone = null; public RandomZoneEvent() { loadConfig(); loadZones(); registerZoneListeners(); } /** * Registra listeners a TODAS LAS ZONAS random */ private void registerZoneListeners() { for (ZoneType zone : _availableZones) { addEnterZoneId(zone.getId()); addExitZoneId(zone.getId()); LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName()); } } private void loadConfig() { new IXmlReader() { @Override public void load() { parseDatapackFile(CONFIG_FILE); } @Override public void parseDocument(Document doc, File file) { forEach(doc, "event", eventNode -> { final StatSet att = new StatSet(parseAttributes(eventNode)); final String name = att.getString("name"); for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling()) { if ("schedule".equals(node.getNodeName())) { final StatSet attributes = new StatSet(parseAttributes(node)); final String pattern = attributes.getString("pattern"); final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern); final StatSet params = new StatSet(); params.set("Name", name); params.set("SchedulingPattern", pattern); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } }); } }.load(); } private void loadZones() { for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class)) { if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone")) { _availableZones.add(zone); LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")"); } } LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size()); } @Override public void onTimerEvent(String event, StatSet params, Npc npc, Player player) { if (event.startsWith("Schedule_")) { eventStart(null); final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern")); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer(event, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } @Override public boolean eventStart(Player eventMaker) { if (_isActive) { if (eventMaker != null) { eventMaker.sendMessage("RandomZoneEvent already active."); } return false; } if (_availableZones.isEmpty()) { Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured."); return false; } _isActive = true; Broadcast.toAllOnlinePlayers("⚔️ Random Zone Event has started!"); _eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000); return true; } private void activateRandomZone() { _activeZone = _availableZones.get(new Random().nextInt(_availableZones.size())); _activeZone.setEnabled(true); Broadcast.toAllOnlinePlayers("🔥 Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!"); _eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L); } @Override public boolean eventStop() { if (!_isActive) { return false; } _isActive = false; if (_eventTask != null) { _eventTask.cancel(true); _eventTask = null; } if (_activeZone != null) { _activeZone.setEnabled(false); Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended. " + _activeZone.getName() + " is back to normal."); _activeZone = null; } else { Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended."); } return true; } @Override public void onEnterZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, true); if (creature.isPlayer()) { creature.sendMessage("Esta zona está en modo PvP temporalmente."); } } } @Override public void onExitZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, false); if (creature.isPlayer()) { creature.sendMessage("Abandonaste la zona PvP temporal."); } } } @Override public boolean eventBypass(Player player, String bypass) { return true; } @Override public String onEvent(String event, Npc npc, Player player) { return super.onEvent(event, npc, player); } @Override public String onFirstTalk(Npc npc, Player player) { return null; } public static void main(String[] args) { new RandomZoneEvent(); } } i have this but its not working
-
ZonePvPSpawnBossRadio=0 ZonePvPSpawnBossBarakiel=0 at the Customs.ini in L2Server folder. Im prety sure this is it because i had the same problem with you in cruma 1 floor for example and i couldn't fix it but i fixed it finally by changing these 2 lines
-
Topics

Question
iAlreadyExist
hello guys im trying to install one remote class master on acis and i had one problem maybe u guys can help me
http://prnt.sc/bnij8r
all the code
### Eclipse Workspace Patch 1.0 #P L2jFanatic Index: dist/data/html/classmaster/tutorialtemplate.htm =================================================================== --- dist/data/html/classmaster/tutorialtemplate.htm (revision 0) +++ dist/data/html/classmaster/tutorialtemplate.htm (working copy) @@ -0,0 +1,13 @@ +<html> + <body> + <center>%name% Class Master:</center><br> + %menu% + <br><br> + Item(s) required for class change: + <table width=270> + %req_items% + </table> + <br><br> + <a action="link COXX">Ask me next time.</a> + </body> +</html> Index: java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java (revision 5) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2ClassMasterInstance.java (working copy) @@ -17,6 +17,7 @@ import java.util.List; import net.sf.l2j.Config; +import net.sf.l2j.gameserver.cache.HtmCache; import net.sf.l2j.gameserver.datatables.CharTemplateTable; import net.sf.l2j.gameserver.datatables.ItemTable; import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; @@ -25,6 +26,9 @@ import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; +import net.sf.l2j.gameserver.network.serverpackets.TutorialCloseHtml; +import net.sf.l2j.gameserver.network.serverpackets.TutorialShowHtml; +import net.sf.l2j.gameserver.network.serverpackets.TutorialShowQuestionMark; import net.sf.l2j.gameserver.network.serverpackets.UserInfo; import net.sf.l2j.util.StringUtil; @@ -114,6 +118,53 @@ super.onBypassFeedback(player, command); } + public static final void onTutorialLink(L2PcInstance player, String request) + { + if (!Config.ALTERNATE_CLASS_MASTER || request == null || !request.startsWith("CO")) + return; + + if (!player.getFloodProtectors().getServerBypass().tryPerformAction("changeclass")) + return; + + try + { + int val = Integer.parseInt(request.substring(2)); + checkAndChangeClass(player, val); + } + catch (NumberFormatException e) + { + } + player.sendPacket(TutorialCloseHtml.STATIC_PACKET); + } + + public static final void onTutorialQuestionMark(L2PcInstance player, int number) + { + if (!Config.ALTERNATE_CLASS_MASTER || number != 1001) + return; + + showTutorialHtml(player); + } + + public static final void showQuestionMark(L2PcInstance player) + { + if (!Config.ALLOW_CLASS_MASTERS) + return; + + if (!Config.ALTERNATE_CLASS_MASTER) + return; + + final ClassId classId = player.getClassId(); + if (getMinLevel(classId.level()) > player.getLevel()) + return; + + if (!Config.CLASS_MASTER_SETTINGS.isAllowed(classId.level() + 1)) + { + return; + } + + player.sendPacket(new TutorialShowQuestionMark(1001)); + } + private static final void showHtmlMenu(L2PcInstance player, int objectId, int level) { NpcHtmlMessage html = new NpcHtmlMessage(objectId); @@ -203,6 +254,29 @@ player.sendPacket(html); } + private static final void showTutorialHtml(L2PcInstance player) + { + final ClassId currentClassId = player.getClassId(); + if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE) + return; + + String msg = HtmCache.getInstance().getHtm("data/html/classmaster/tutorialtemplate.htm"); + msg = msg.replaceAll("%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId())); + + final StringBuilder menu = new StringBuilder(100); + for (ClassId cid : ClassId.values()) + { + if (validateClassId(currentClassId, cid)) + { + StringUtil.append(menu, "<a action=\"link CO", String.valueOf(cid.getId()), "\">", CharTemplateTable.getInstance().getClassNameById(cid.getId()), "</a><br>"); + } + } + + msg = msg.replaceAll("%menu%", menu.toString()); + msg = msg.replace("%req_items%", getRequiredItems(currentClassId.level() + 1)); + player.sendPacket(new TutorialShowHtml(msg)); + } + private static final boolean checkAndChangeClass(L2PcInstance player, int val) { final ClassId currentClassId = player.getClassId(); @@ -255,6 +329,11 @@ player.setBaseClass(player.getActiveClass()); player.broadcastUserInfo(); + + if (Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1) && Config.ALTERNATE_CLASS_MASTER && (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || ((player.getClassId().level() == 2) && (player.getLevel() >= 76)))) + { + showQuestionMark(player); + } return true; } Index: dist/config/npcs.properties =================================================================== --- dist/config/npcs.properties (revision 5) +++ dist/config/npcs.properties (working copy) @@ -78,6 +78,13 @@ # Default = False AllowEntireTree = False +# Then character reach levels 20,40,76 he will receive tutorial page +# with list of the all possible variants, and can select and immediately +# change to the new occupation, or decide to choose later (on next login). +# Can be used with or without classic Class Masters. +# Default = False +AlternateClassMaster = False + # Allow free teleportation around the world. AltFreeTeleporting = False Index: java/net/sf/l2j/Config.java =================================================================== --- java/net/sf/l2j/Config.java (revision 6) +++ java/net/sf/l2j/Config.java (working copy) @@ -306,6 +306,7 @@ public static boolean ALLOW_CLASS_MASTERS; public static ClassMasterSettings CLASS_MASTER_SETTINGS; public static boolean ALLOW_ENTIRE_TREE; + public static boolean ALTERNATE_CLASS_MASTER; public static boolean ANNOUNCE_MAMMON_SPAWN; public static boolean ALT_MOB_AGRO_IN_PEACEZONE; public static boolean ALT_GAME_FREE_TELEPORT; @@ -931,6 +932,7 @@ ALLOW_ENTIRE_TREE = npcs.getProperty("AllowEntireTree", false); if (ALLOW_CLASS_MASTERS) CLASS_MASTER_SETTINGS = new ClassMasterSettings(npcs.getProperty("ConfigClassMaster")); + ALTERNATE_CLASS_MASTER = npcs.getProperty("AlternateClassMaster", false); ALT_GAME_FREE_TELEPORT = npcs.getProperty("AltFreeTeleporting", false); ANNOUNCE_MAMMON_SPAWN = npcs.getProperty("AnnounceMammonSpawn", true); Index: java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (revision 5) +++ java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (working copy) @@ -32,6 +32,7 @@ import net.sf.l2j.gameserver.model.L2Clan; import net.sf.l2j.gameserver.model.L2Clan.SubPledge; import net.sf.l2j.gameserver.model.L2World; +import net.sf.l2j.gameserver.model.actor.instance.L2ClassMasterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.entity.ClanHall; import net.sf.l2j.gameserver.model.entity.Couple; @@ -256,6 +257,8 @@ // Attacker or spectator logging into a siege zone will be ported at town. if (!activeChar.isGM() && (!activeChar.isInSiege() || activeChar.getSiegeState() < 2) && activeChar.isInsideZone(ZoneId.SIEGE)) activeChar.teleToLocation(MapRegionTable.TeleportWhereType.Town); + + L2ClassMasterInstance.showQuestionMark(activeChar); } private static void engage(L2PcInstance cha) Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialQuestionMark.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialQuestionMark.java (revision 5) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialQuestionMark.java (working copy) @@ -14,6 +14,7 @@ */ package net.sf.l2j.gameserver.network.clientpackets; +import net.sf.l2j.gameserver.model.actor.instance.L2ClassMasterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.quest.QuestState; @@ -34,6 +35,8 @@ if (player == null) return; + L2ClassMasterInstance.onTutorialQuestionMark(player, _number); + QuestState qs = player.getQuestState("Tutorial"); if (qs != null) qs.getQuest().notifyEvent("QM" + _number + "", null, player); Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialLinkHtml.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialLinkHtml.java (revision 5) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestTutorialLinkHtml.java (working copy) @@ -14,6 +14,7 @@ */ package net.sf.l2j.gameserver.network.clientpackets; +import net.sf.l2j.gameserver.model.actor.instance.L2ClassMasterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.quest.QuestState; @@ -34,6 +35,8 @@ if (player == null) return; + L2ClassMasterInstance.onTutorialLink(player, _bypass); + QuestState qs = player.getQuestState("Tutorial"); if (qs != null) qs.getQuest().notifyEvent(_bypass, null, player); Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (revision 5) +++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy) @@ -18,6 +18,7 @@ import net.sf.l2j.gameserver.datatables.NpcTable; import net.sf.l2j.gameserver.datatables.PetDataTable; import net.sf.l2j.gameserver.model.actor.L2Character; +import net.sf.l2j.gameserver.model.actor.instance.L2ClassMasterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance; import net.sf.l2j.gameserver.model.base.Experience; @@ -164,6 +165,8 @@ getActiveChar().setCurrentCp(getMaxCp()); getActiveChar().broadcastPacket(new SocialAction(getActiveChar(), 15)); getActiveChar().sendPacket(SystemMessageId.YOU_INCREASED_YOUR_LEVEL); + + L2ClassMasterInstance.showQuestionMark(getActiveChar()); } getActiveChar().rewardSkills(); // Give Expertise skill of this levelEdited by haskovo15 answers to this question
Recommended Posts