https://youtu.be/gFPjzUDLxSM
### Eclipse Workspace Patch 1.0
Index: java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (revision 1)
+++ java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (working copy)
@@ -62,6 +62,7 @@
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSiege;
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSkill;
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSpawn;
+import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminStriderRace;
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTarget;
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTeleport;
import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminUnblockIp;
@@ -127,6 +128,8 @@
registerAdminCommandHandler(new AdminTeleport());
registerAdminCommandHandler(new AdminUnblockIp());
registerAdminCommandHandler(new AdminZone());
+ //custom
+ registerAdminCommandHandler(new AdminStriderRace());
}
public void registerAdminCommandHandler(IAdminCommandHandler handler)
Index: java/net/sf/l2j/gameserver/custom/striderrace/StriderRace.java
===================================================================
--- java/net/sf/l2j/gameserver/custom/striderrace/StriderRace.java (revision 0)
+++ java/net/sf/l2j/gameserver/custom/striderrace/StriderRace.java (working copy)
@@ -0,0 +1,236 @@
+/*
+ * 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 net.sf.l2j.gameserver.custom.striderrace;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.datatables.MapRegionTable;
+import net.sf.l2j.gameserver.datatables.NpcTable;
+import net.sf.l2j.gameserver.datatables.SpawnTable;
+import net.sf.l2j.gameserver.model.L2Spawn;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
+import net.sf.l2j.gameserver.skills.AbnormalEffect;
+import net.sf.l2j.gameserver.util.Broadcast;
+
+/**
+ * @author Bluur
+ * @version 1.1
+ */
+public class StriderRace
+{
+ private static StriderRace INSTANCE;
+ private StriderRaceState srState = StriderRaceState.DESACTIVED;
+ private List<L2PcInstance> players = new ArrayList<>();
+
+ private StriderRace(){}
+
+ public void startEvent()
+ {
+ srState = StriderRaceState.REGISTER;
+ announceEvent("The event started! Commands .joinsr or .leavesr");
+ announceEvent("Registration time: 5 minutes!");
+ sleep(60);
+ announceEvent("[4] minutes to the end of the record!");
+ sleep(60);
+ announceEvent("[3] minutes to the end of the record!");
+ sleep(60);
+ announceEvent("[2] minutes to the end of the record!");
+ sleep(60);
+ announceEvent("[1] minutes to the end of the record!");
+ sleep(60);
+ if (!minPlayers())
+ {
+ abortEvent();
+ return;
+ }
+ srState = StriderRaceState.WAIT;
+ announceEvent("closed registration! Total number of registered players: "+ players.size());
+ announceEvent("The players will be teleported in 10 seconds!");
+ sleep(10);
+ teleportPlayers();
+ mountPlayer(true);
+ paralizedPlayer(true);
+ announceEvent("The event will start in 15 seconds!");
+ sleep(15);
+ srState = StriderRaceState.ATIVED;
+ announceEvent("The race is on! Go Go Go!");
+ spawnNpc();
+ paralizedPlayer(false);
+ sleep(300); // duração do evento em segundos
+ if (srState == StriderRaceState.ATIVED)
+ finishEvent();
+ }
+
+ private void paralizedPlayer(boolean value)
+ {
+ if (value)
+ {
+ for (L2PcInstance player : players)
+ {
+ player.setIsParalyzed(true);
+ player.startAbnormalEffect(AbnormalEffect.HOLD_2);
+ }
+ }
+ else
+ {
+ for (L2PcInstance player : players)
+ {
+ player.setIsParalyzed(false);
+ player.stopAbnormalEffect(AbnormalEffect.HOLD_2);
+ }
+ }
+ }
+
+ private void mountPlayer(boolean value)
+ {
+ if (value)
+ {
+ for (L2PcInstance player : players)
+ {
+ if (player != null)
+ {
+ player.getRadar().addMarker(Config.EVENT_SR_LOC_ARRIVAL_X, Config.EVENT_SR_LOC_ARRIVAL_Y, Config.EVENT_SR_LOC_ARRIVAL_Z);
+ player.mount(12526, 0, false);
+ }
+ }
+ }
+ else
+ {
+ for (L2PcInstance player : players)
+ {
+ if (player != null)
+ {
+ player.getRadar().removeMarker(Config.EVENT_SR_LOC_ARRIVAL_X, Config.EVENT_SR_LOC_ARRIVAL_Y, Config.EVENT_SR_LOC_ARRIVAL_Z);
+ player.dismount();
+ }
+ }
+ }
+ }
+
+ private void abortEvent()
+ {
+ srState = StriderRaceState.DESACTIVED;
+ announceEvent("The event was terminated for lack of participants!");
+ players.clear();
+ }
+
+ public void finishEvent()
+ {
+ srState = StriderRaceState.DESACTIVED;
+ announceEvent("The event duration time is up! Thank all...");
+ teleportPlayersToTown();
+ mountPlayer(false);
+ players.clear();
+ }
+
+ private static void announceEvent(String sendMessage)
+ {
+ Broadcast.announceToOnlinePlayers("[Strider Race]: " + sendMessage, true);
+ }
+
+ private void teleportPlayers()
+ {
+ for (L2PcInstance player : players)
+ player.teleToLocation(Config.EVENT_SR_LOC_PLAYER_X, Config.EVENT_SR_LOC_PLAYER_Y, Config.EVENT_SR_LOC_PLAYER_Z, 60);
+ }
+
+ private void teleportPlayersToTown()
+ {
+ for (L2PcInstance player : players)
+ player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+ }
+
+ private boolean minPlayers()
+ {
+ if (players.size() < Config.EVENT_SR_MINIMUM_PLAYERS)
+ return false;
+
+ return true;
+ }
+
+ public boolean maxPlayers()
+ {
+ if (players.size() >= Config.EVENT_SR_MAXIMUM_PLAYERS)
+ return false;
+
+ return true;
+ }
+
+ public boolean containsPlayer(L2PcInstance player)
+ {
+ return players.contains(player);
+ }
+
+ public void registerPlayer(L2PcInstance player)
+ {
+ players.add(player);
+ }
+
+ public void removePlayer(L2PcInstance player)
+ {
+ players.remove(player);
+ }
+
+ private static void spawnNpc()
+ {
+ NpcTemplate tp = NpcTable.getInstance().getTemplate(Config.EVENT_SR_LOC_ID_NPC);
+ try
+ {
+ L2Spawn spawn = null;
+
+ spawn = new L2Spawn(tp);
+ spawn.setLocx(Config.EVENT_SR_LOC_ARRIVAL_X);
+ spawn.setLocy(Config.EVENT_SR_LOC_ARRIVAL_Y);
+ spawn.setLocz(Config.EVENT_SR_LOC_ARRIVAL_Z);
+ spawn.setHeading(0);
+
+ SpawnTable.getInstance().addNewSpawn(spawn, false);
+ spawn.init();
+ spawn.stopRespawn();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public StriderRaceState getStriderRaceState()
+ {
+ return srState;
+ }
+
+ private static void sleep(int value)
+ {
+ try
+ {
+ Thread.sleep(1000 * value);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public static StriderRace getInstance()
+ {
+ if (INSTANCE == null)
+ INSTANCE = new StriderRace();
+
+ return INSTANCE;
+ }
+}
Index: java/net/sf/l2j/gameserver/network/clientpackets/Logout.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (revision 1)
+++ java/net/sf/l2j/gameserver/network/clientpackets/Logout.java (working copy)
@@ -15,6 +15,8 @@
package net.sf.l2j.gameserver.network.clientpackets;
import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
import net.sf.l2j.gameserver.instancemanager.SevenSignsFestival;
import net.sf.l2j.gameserver.model.L2Party;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
@@ -44,6 +46,16 @@
return;
}
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.ATIVED)
+ {
+ if (StriderRace.getInstance().containsPlayer(player))
+ {
+ player.sendMessage("[Strider Race]: You can't logout in strider race!");
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+ }
+
if (player.isLocked())
{
if (Config.DEBUG)
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 1)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -50,6 +50,8 @@
import net.sf.l2j.gameserver.ai.NextAction.NextActionCallback;
import net.sf.l2j.gameserver.communitybbs.BB.Forum;
import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
import net.sf.l2j.gameserver.datatables.AccessLevels;
import net.sf.l2j.gameserver.datatables.CharNameTable;
import net.sf.l2j.gameserver.datatables.CharTemplateTable;
@@ -5012,6 +5014,16 @@
{
sendPacket(new SetupGauge(3, 0, 0));
int petId = _mountNpcId;
+
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.ATIVED)
+ {
+ if (petId == 12526 && StriderRace.getInstance().containsPlayer(this))
+ {
+ sendMessage("[Strider Race]: You can't unmount in strider race!");
+ return false;
+ }
+ }
+
if (setMount(0, 0, 0))
{
stopFeed();
Index: java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (revision 1)
+++ java/net/sf/l2j/gameserver/model/actor/stat/PcStat.java (working copy)
@@ -15,6 +15,8 @@
package net.sf.l2j.gameserver.model.actor.stat;
import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.datatables.PetDataTable;
import net.sf.l2j.gameserver.model.actor.L2Character;
@@ -334,6 +336,9 @@
if (penalty > 0)
val *= Math.pow(0.84, penalty);
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.ATIVED && StriderRace.getInstance().containsPlayer(getActiveChar()))
+ val *= Config.EVENT_SR_SPEED;
+
return val;
}
Index: java/net/sf/l2j/Config.java
===================================================================
--- java/net/sf/l2j/Config.java (revision 1)
+++ java/net/sf/l2j/Config.java (working copy)
@@ -226,6 +226,20 @@
public static int ALT_FISH_CHAMPIONSHIP_REWARD_4;
public static int ALT_FISH_CHAMPIONSHIP_REWARD_5;
+ /** Strider Race */
+ public static int EVENT_SR_MINIMUM_PLAYERS;
+ public static int EVENT_SR_MAXIMUM_PLAYERS;
+ public static int[][] EVENT_SR_REWARD_TOP1;
+ public static int[][] EVENT_SR_REWARD_TOP2;
+ public static int[][] EVENT_SR_REWARD_TOP3;
+ public static double EVENT_SR_SPEED;
+ public static int EVENT_SR_REWARD_COUNT;
+ public static int EVENT_SR_LOC_ARRIVAL_X;
+ public static int EVENT_SR_LOC_ARRIVAL_Y;
+ public static int EVENT_SR_LOC_ARRIVAL_Z;
+ public static int EVENT_SR_LOC_PLAYER_X;
+ public static int EVENT_SR_LOC_PLAYER_Y;
+ public static int EVENT_SR_LOC_PLAYER_Z;
+ public static int EVENT_SR_LOC_ID_NPC;
+
// --------------------------------------------------
// HexID
// --------------------------------------------------
@@ -879,6 +893,18 @@
ALT_FISH_CHAMPIONSHIP_REWARD_4 = events.getProperty("AltFishChampionshipReward4", 200000);
ALT_FISH_CHAMPIONSHIP_REWARD_5 = events.getProperty("AltFishChampionshipReward5", 100000);
+ EVENT_SR_LOC_ID_NPC = events.getProperty("EventSRnpcID", 10);
+ EVENT_SR_MINIMUM_PLAYERS = events.getProperty("EventSRminimumPlayers", 2);
+ EVENT_SR_MAXIMUM_PLAYERS = events.getProperty("EventSRmaximumPlayers", 2);
+ EVENT_SR_REWARD_TOP1 = parseItemsList(events.getProperty("EventSRrewardsTop1", "57,300"));
+ EVENT_SR_REWARD_TOP2 = parseItemsList(events.getProperty("EventSRrewardsTop2", "57,200"));
+ EVENT_SR_REWARD_TOP3 = parseItemsList(events.getProperty("EventSRrewardsTop3", "57,100"));
+ EVENT_SR_SPEED = events.getProperty("EventSRspeedBoost", 1.0);
+ EVENT_SR_LOC_PLAYER_X = events.getProperty("EventSRlocPlayerX", 0);
+ EVENT_SR_LOC_PLAYER_Y = events.getProperty("EventSRlocPlayerY", 0);
+ EVENT_SR_LOC_PLAYER_Z = events.getProperty("EventSRlocPlayerZ", 0);
+ EVENT_SR_LOC_ARRIVAL_X = events.getProperty("EventSRlocArrivalX", 0);
+ EVENT_SR_LOC_ARRIVAL_Y = events.getProperty("EventSRlocArrivalY", 0);
+ EVENT_SR_LOC_ARRIVAL_Z = events.getProperty("EventSRlocArrivalZ", 0);
Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminStriderRace.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminStriderRace.java (revision 0)
+++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminStriderRace.java (working copy)
@@ -0,0 +1,60 @@
+/*
+ * 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 net.sf.l2j.gameserver.handler.admincommandhandlers;
+
+import net.sf.l2j.gameserver.ThreadPoolManager;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
+import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author Bluur
+ *
+ */
+public class AdminStriderRace implements IAdminCommandHandler
+{
+ private static final String[] ADMIN_COMMANDS = {"admin_startsr"};
+
+ @Override
+ public boolean useAdminCommand(String command, L2PcInstance activeChar)
+ {
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.DESACTIVED)
+ initEvent();
+ else
+ activeChar.sendMessage("[Strider Race]: The event this already in progress!");
+
+ return true;
+ }
+
+ private static void initEvent()
+ {
+ ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ StriderRace.getInstance().startEvent();
+ }
+
+ }, 1);
+ }
+
+ @Override
+ public String[] getAdminCommandList()
+ {
+ return ADMIN_COMMANDS;
+ }
+}
Index: java/net/sf/l2j/gameserver/custom/striderrace/StriderRaceState.java
===================================================================
--- java/net/sf/l2j/gameserver/custom/striderrace/StriderRaceState.java (revision 0)
+++ java/net/sf/l2j/gameserver/custom/striderrace/StriderRaceState.java (working copy)
@@ -0,0 +1,27 @@
+/*
+ * 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 net.sf.l2j.gameserver.custom.striderrace;
+
+/**
+ * @author Bluur
+ *
+ */
+public enum StriderRaceState
+{
+ DESACTIVED,
+ REGISTER,
+ WAIT,
+ ATIVED;
+}
Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java (revision 1)
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java (working copy)
@@ -15,6 +15,8 @@
package net.sf.l2j.gameserver.network.clientpackets;
import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
import net.sf.l2j.gameserver.instancemanager.SevenSignsFestival;
import net.sf.l2j.gameserver.model.L2Party;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
@@ -47,6 +49,16 @@
return;
}
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.ATIVED)
+ {
+ if (StriderRace.getInstance().containsPlayer(player))
+ {
+ player.sendMessage("[Strider Race]: You can't restart in strider race!");
+ sendPacket(RestartResponse.valueOf(false));
+ return;
+ }
+ }
+
if (player.isLocked())
{
sendPacket(RestartResponse.valueOf(false));
Index: java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/RegStriderRace.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/RegStriderRace.java (revision 0)
+++ java/net/sf/l2j/gameserver/handler/voicedcommandhandlers/RegStriderRace.java (working copy)
@@ -0,0 +1,83 @@
+/*
+ * 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 net.sf.l2j.gameserver.handler.voicedcommandhandlers;
+
+import net.sf.l2j.gameserver.custom.striderrace.StriderRace;
+import net.sf.l2j.gameserver.custom.striderrace.StriderRaceState;
+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author Bluur
+ */
+public class RegStriderRace implements IVoicedCommandHandler
+{
+ private static final String[] voiced_commands =
+ {
+ "joinsr",
+ "leavesr"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params)
+ {
+ if (command.equals("joinsr"))
+ {
+ if (register(activeChar))
+ {
+ StriderRace.getInstance().registerPlayer(activeChar);
+ activeChar.sendMessage("[Strider Race]: You have been successfully registered!");
+ }
+ }
+ else if (command.equals("leavesr"))
+ {
+ remove(activeChar);
+ }
+ return true;
+ }
+
+ private static boolean register(L2PcInstance p)
+ {
+ if (!StriderRace.getInstance().maxPlayers())
+ {
+ p.sendMessage("[Strider Race]: Limit of players was reached.");
+ return false;
+ }
+ else if (StriderRace.getInstance().getStriderRaceState() != StriderRaceState.REGISTER || p.getKarma() > 0 || p.isInCombat() || p.isInOlympiadMode() || p.inObserverMode() || StriderRace.getInstance().containsPlayer(p))
+ {
+ p.sendMessage("[Strider Race]: conditions for registration are inappropriate !!!");
+ return false;
+ }
+
+ return true;
+ }
+
+ private static boolean remove(L2PcInstance p)
+ {
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.REGISTER && StriderRace.getInstance().containsPlayer(p))
+ {
+ StriderRace.getInstance().removePlayer(p);
+ p.sendMessage("[Strider Race]: you have been successfully removed!");
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return voiced_commands;
+ }
+}
Index: java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java (revision 0)
+++ java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java (working copy)
import java.util.Map;
+import net.sf.l2j.gameserver.handler.voicedcommandhandlers.RegStriderRace;
protected VoicedCommandHandler()
{
+ registerVoicedCommandHandler(new RegStriderRace());
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2StriderRaceEventInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2StriderRaceEventInstance.java (revision 0)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2StriderRaceEventInstance.java (working copy)
@@ -0,0 +1,102 @@
+/*
+ * 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 net.sf.l2j.gameserver.model.actor.instance;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.ai.CtrlIntention;
+import net.sf.l2j.gameserver.datatables.MapRegionTable;
+import net.sf.l2j.gameserver.datatables.SpawnTable;
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.L2Spawn;
+import net.sf.l2j.gameserver.model.actor.L2Npc;
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
+import net.sf.l2j.gameserver.model.striderrace.StriderRace;
+import net.sf.l2j.gameserver.model.striderrace.StriderRaceState;
+import net.sf.l2j.gameserver.util.Broadcast;
+
+public class L2StriderRaceEventInstance extends L2NpcInstance
+{
+ public L2StriderRaceEventInstance(int objectId, NpcTemplate template)
+ {
+ super(objectId, template);
+ }
+
+ private static int rankPlayer = 0;
+
+ @Override
+ public void onAction(L2PcInstance player)
+ {
+ if (player.getTarget() != this)
+ player.setTarget(this);
+ else
+ {
+ if (!canInteract(player))
+ player.getAI().setIntention(CtrlIntention.INTERACT, this);
+ else
+ {
+ if (StriderRace.getInstance().getStriderRaceState() == StriderRaceState.ATIVED && StriderRace.getInstance().containsPlayer(player))
+ {
+ if (rankPlayer < 2)
+ {
+ rankPlayer++;
+ Broadcast.announceToOnlinePlayers("[Strider Race]: [" + rankPlayer + "] to arrive was -> " + player.getName(), true);
+ rewardPlayer(player);
+ StriderRace.getInstance().removePlayer(player);
+ player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+ player.dismount();
+ return;
+ }
+ rankPlayer += 1;
+ Broadcast.announceToOnlinePlayers("[Strider Race]: [3] to arrive was -> " + player.getName(), true);
+ rewardPlayer(player);
+ StriderRace.getInstance().finishEvent();
+ rankPlayer = 0;
+
+ L2Object obj = player.getTarget();
+ if (obj != null && obj instanceof L2Npc)
+ {
+ L2Npc target = (L2Npc) obj;
+ target.deleteMe();
+
+ L2Spawn spawn = target.getSpawn();
+ if (spawn != null)
+ {
+ spawn.stopRespawn();
+ SpawnTable.getInstance().deleteSpawn(spawn, true);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static void rewardPlayer(L2PcInstance player)
+ {
+ switch (rankPlayer)
+ {
+ case 1:
+ for (int[] item : Config.EVENT_SR_REWARD_TOP1)
+ player.addItem("", item[0], item[1], player, true);
+ break;
+ case 2:
+ for (int[] item : Config.EVENT_SR_REWARD_TOP2)
+ player.addItem("", item[0], item[1], player, true);
+ break;
+ default:
+ for (int[] item : Config.EVENT_SR_REWARD_TOP3)
+ player.addItem("", item[0], item[1], player, true);
+ }
+ }
+}
Index: config/events.properties
===================================================================
--- config/events.properties (revision 1)
+++ config/events.properties (working copy)
@@ -251,4 +251,29 @@
AltFishChampionshipReward2 = 500000
AltFishChampionshipReward3 = 300000
AltFishChampionshipReward4 = 200000
-AltFishChampionshipReward5 = 100000
\ No newline at end of file
+AltFishChampionshipReward5 = 100000
+
+#=============================================================
+# Strider Race
+#=============================================================
+# NPC ID (Type L2StriderRaceEvent)
+EventSRnpcID = 9106
+
+# Minimum players
+EventSRminimumPlayers = 2
+
+# Maximum players
+EventSRmaximumPlayers = 50
+
+# Prize for first place
+EventSRrewardsTop1 = 57,100000000;
+# Prize for second place
+EventSRrewardsTop2 = 57,50000000;
+# Prize for third place
+EventSRrewardsTop3 = 57,25000000;
+
+# Default: 1.0
+EventSRspeedBoost = 1.0
+
+# Localization player
+EventSRlocPlayerX = 156809
+EventSRlocPlayerY = 53860
+EventSRlocPlayerZ = -3250
+
+# Localization arrival
+EventSRlocArrivalX = 167919
+EventSRlocArrivalY = 50679
+EventSRlocArrivalZ = -4111
\ No newline at end of file
gameserver/data/xml/admin_commands_rights.xml
+ <aCar name="admin_startsr" accessLevel="1" />
gameserver/data/xml/npcs
<npc id="9106" idTemplate="35062" name="Strider Race Event" title="[ARRIVAL HERE]">
<set name="level" val="75"/>
<set name="radius" val="10"/>
<set name="height" val="80"/>
<set name="rHand" val="0"/>
<set name="lHand" val="0"/>
<set name="type" val="L2StriderRaceEvent"/>
<set name="exp" val="0"/>
<set name="sp" val="10"/>
<set name="hp" val="2676.65854"/>
<set name="mp" val="1507.8"/>
<set name="hpRegen" val="8.5"/>
<set name="mpRegen" val="3"/>
<set name="pAtk" val="794.70901"/>
<set name="pDef" val="319.24623"/>
<set name="mAtk" val="542.68324"/>
<set name="mDef" val="233.61053"/>
<set name="crit" val="4"/>
<set name="atkSpd" val="253"/>
<set name="str" val="40"/>
<set name="int" val="21"/>
<set name="dex" val="30"/>
<set name="wit" val="20"/>
<set name="con" val="43"/>
<set name="men" val="20"/>
<set name="corpseTime" val="7"/>
<set name="walkSpd" val="50"/>
<set name="runSpd" val="120"/>
<set name="dropHerbGroup" val="0"/>
<set name="attackRange" val="40"/>
<ai type="default" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" clan="door_clan;dion_siege_clan" clanRange="600" canMove="false" seedable="false"/>
<skills>
<skill id="4045" level="1"/>
<skill id="4416" level="19"/>
</skills>
</npc>
Broadcast.announceToOnlinePlayers("[Strider Race]: The event ends with the winner -> " +player.getName(), true);
Broadcast.announceToOnlinePlayers("[Strider Race]: " + sendMessage, true);
Creditos: Bluur