Secret Experience

Secret Experience (https://secretexperience.net/index.php)
-   [Lineage] Java Mods (https://secretexperience.net/forumdisplay.php?f=636)
-   -   [L2JFree] Novo TvT Totalmente refeito (https://secretexperience.net/showthread.php?t=29670)

Daniel2 21-02-2011 11:12 AM

Novo TvT Totalmente refeito
 
bom Galera eu venho aque postar um Mod muito bom que muita gente vai precisar TvT totalmente refeito e com muito mais opções para se trabalhar.

Código:

Index: config/autoevent.properties
===================================================================
--- config/autoevent.properties (revision 0)
+++ config/autoevent.properties (revision 0)
@@ -0,0 +1,104 @@
+# New enhanced engine for automated events
+# No more inefficient class usage, no more useless checks
+# and crap code style made by FBIagent & successors
+# All time values are in milliseconds!
+
+EnableAutoTvT = True
+
+# You may setup as many teams as you wish
+# x1,y1,z1;x2,y2,z2;...
+# Currently = peace zone (monster race track), CHANGE!
+TvTTeamLocations = 12295,182068,-3550;14050,182082,-3555
+# Teleport players to a set location after event instead of where they were
+TvTTeleportAfterEventSpecial = False
+# The special location coordinates (currently: Giran temple entrance)
+TvTTeleportSpecialLocation = 84096,148618,-3404
+
+# You may set up as many reward items as you wish
+# id1,count1;id2,count2;...
+TvTRewards = 57,1000000;5575,100
+# Minimum personal score awarded. TKers or people that keep dying may have a negative score.
+# Everyone starts with 0, if you get a dc and relog, you will have 0.
+# TKers (after relog) will start with (0 - TK points lost) if punish is enabled
+TvTRewardedMinScore = 1
+
+# Maximum level allowed to join
+TvTMaxLevel = 85
+# Minimum level allowed to join
+TvTMinLevel = 1
+# Maximum participants in event
+TvTMaxParticipants = 25
+# Minimum participants in event
+TvTMinParticipants = 6
+# Can players with cw join
+TvTRegisterCursedWeaponOwner = False
+# Can heroes join
+TvTRegisterHero = True
+# If a player logged out and back in during registration period,
+# must he manually register again (false) or he is auto re-registered (true)
+# the player will not be re-registered if slots are full
+TvTRegisterOnRelogin = True
+
+# Initial delay before starting registration once server is loaded up
+TvTDelayInitial = 900000
+# Delay between end of rewards period and new registration period
+TvTDelayBetweenEvents = 900000
+
+# How long shall the registration period last?
+TvTLengthRegistration = 300000
+# How many times should we announce that registration period is in progress?
+# Doesn't include the announcement when the period starts
+TvTAnnounceRegistration = 4
+# How long shall we wait for players to get teleported to the event area
+TvTLengthPreparation = 60000
+# How long shall the event last
+TvTLengthCombat = 240000
+# How long to wait until players are teleported back
+# It works similarly as preparation period;
+# Once the event is over, players get rewarded and instantly teleported
+TvTLengthRewards = 15000
+
+# These items will not be allowed to use and unequiped if necessary
+# The items can be BOTH usable (potions, scrolls) and equipable (weapons, helmets)
+TvTItemsNotAllowed = 6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,9388,9389,9390
+# Same as player spawn protection, but this will override that setting during TvT
+TvTSpawnProtection = 0
+# Remove all effects on start
+TvTCancelBuffsOnStart = False
+# Remove cubics on start
+TvTCancelCubicsOnStart = False
+# Remove servitors on start
+TvTCancelServitorsOnStart = True
+# Remove transformation on start
+TvTCancelTransformationOnStart = False
+# Recover CP/HP/MP
+TvTRecoverOnStart = True
+
+# Use a system that gives rewards for killing and not dying
+TvTGodlikeSystem = True
+# Announce whenever someone acquires godlike status or kills being godlike
+TvTGodlikeAnnounce = True
+# Minimum kills without dying to become godlike
+TvTGodlikeMinKills = 5
+# Points given for each kill while being godlike
+TvTGodlikeKillPoints = 3
+# Static title
+TvTGodlikeTitle = God-like
+
+# Should we punish someone who kills a team member
+TvTPunishTeamKillers = True
+# Reset kill without death count
+TvTPunishTKResetGodlike = True
+# Remove all effects
+TvTPunishTKCancelBuffs = True
+# Points lost per team kill
+TvTPunishTKDecreaseScore = 5
+# Activate effects (CancelBuffs does not affect these)
+TvTPunishTKDebuff = 1201,130;1206,130;1222,130
+
+# Can players see options "To Village" etc AND use them
+TvTReviveSelf = False
+# Recover CP/HP/MP when revived
+TvTReviveRecover = True
+# Maximum time lying dead
+TvTReviveDelay = 10000
Index: src/main/java/com/l2jfree/Config.java
===================================================================
--- src/main/java/com/l2jfree/Config.java      (revision 5950)
+++ src/main/java/com/l2jfree/Config.java      (working copy)
@@ -38,6 +38,9 @@
 import org.apache.commons.lang.ArrayUtils;
 
 import com.l2jfree.config.L2Properties;
+import com.l2jfree.gameserver.datatables.SkillTable;
+import com.l2jfree.gameserver.model.L2Skill;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.util.Util;
 
 /**
@@ -51,6 +54,7 @@
        static
        {
                registerConfig(new AltConfig());
+              registerConfig(new AutoEventConfig());
                registerConfig(new BossConfig());
                registerConfig(new CastleConfig());
                registerConfig(new ChampionsConfig());
@@ -3194,6 +3198,157 @@
                }
        }
 
+      public static boolean AUTO_TVT_ENABLED;
+      public static int[][] AUTO_TVT_TEAM_LOCATIONS;
+      public static boolean AUTO_TVT_OVERRIDE_TELE_BACK;
+      public static int[] AUTO_TVT_DEFAULT_TELE_BACK;
+      public static int AUTO_TVT_REWARD_MIN_POINTS;
+      public static int[] AUTO_TVT_REWARD_IDS;
+      public static int[] AUTO_TVT_REWARD_COUNT;
+      public static int AUTO_TVT_LEVEL_MAX;
+      public static int AUTO_TVT_LEVEL_MIN;
+      public static int AUTO_TVT_PARTICIPANTS_MAX;
+      public static int AUTO_TVT_PARTICIPANTS_MIN;
+      public static long AUTO_TVT_DELAY_INITIAL_REGISTRATION;
+      public static long AUTO_TVT_DELAY_BETWEEN_EVENTS;
+      public static long AUTO_TVT_PERIOD_LENGHT_REGISTRATION;
+      public static long AUTO_TVT_PERIOD_LENGHT_PREPARATION;
+      public static long AUTO_TVT_PERIOD_LENGHT_EVENT;
+      public static long AUTO_TVT_PERIOD_LENGHT_REWARDS;
+      public static int AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT;
+      public static boolean AUTO_TVT_REGISTER_CURSED;
+      public static boolean AUTO_TVT_REGISTER_HERO;
+      public static int[] AUTO_TVT_DISALLOWED_ITEMS;
+      public static boolean AUTO_TVT_REGISTER_AFTER_RELOG;
+      public static boolean AUTO_TVT_START_CANCEL_BUFFS;
+      public static boolean AUTO_TVT_START_CANCEL_CUBICS;
+      public static boolean AUTO_TVT_START_CANCEL_SERVITORS;
+      public static boolean AUTO_TVT_START_CANCEL_TRANSFORMATION;
+      public static boolean AUTO_TVT_START_RECOVER;
+      public static boolean AUTO_TVT_GODLIKE_SYSTEM;
+      public static boolean AUTO_TVT_GODLIKE_ANNOUNCE;
+      public static int AUTO_TVT_GODLIKE_MIN_KILLS;
+      public static int AUTO_TVT_GODLIKE_POINT_MULTIPLIER;
+      public static String AUTO_TVT_GODLIKE_TITLE;
+      public static boolean AUTO_TVT_TK_PUNISH;
+      public static boolean AUTO_TVT_TK_PUNISH_CANCEL;
+      public static boolean AUTO_TVT_TK_RESET_GODLIKE;
+      public static int AUTO_TVT_TK_PUNISH_POINTS_LOST;
+      public static L2Skill[] AUTO_TVT_TK_PUNISH_EFFECTS;
+      public static boolean AUTO_TVT_REVIVE_SELF;
+      public static boolean AUTO_TVT_REVIVE_RECOVER;
+      public static long AUTO_TVT_REVIVE_DELAY;
+      public static int AUTO_TVT_SPAWN_PROTECT;
+
+      private static final class AutoEventConfig extends ConfigLoader
+      {
+              @Override
+              protected String getName()
+              {
+                      return "autoevent";
+              }
+
+              @Override
+              protected void loadImpl(Properties properties)
+              {
+                      AUTO_TVT_ENABLED = Boolean.parseBoolean(properties.getProperty("EnableAutoTvT", "false"));
+                      if (AUTO_TVT_ENABLED)
+                              AutomatedTvT.startIfNecessary();
+                      StringTokenizer coords;
+                      StringTokenizer locations = new StringTokenizer(properties.getProperty("TvTTeamLocations", ""), ";");
+                      AUTO_TVT_TEAM_LOCATIONS = new int[locations.countTokens()][3];
+                      for (int i = 0; i < AUTO_TVT_TEAM_LOCATIONS.length; i++)
+                      {
+                              coords = new StringTokenizer(locations.nextToken(), ",");
+                              if (coords.countTokens() == 3)
+                              {
+                                      AUTO_TVT_TEAM_LOCATIONS[i] = new int[3];
+                                      AUTO_TVT_TEAM_LOCATIONS[i][0] = Integer.parseInt(coords.nextToken());
+                                      AUTO_TVT_TEAM_LOCATIONS[i][1] = Integer.parseInt(coords.nextToken());
+                                      AUTO_TVT_TEAM_LOCATIONS[i][2] = Integer.parseInt(coords.nextToken());
+                              }
+                              else
+                                      AUTO_TVT_TEAM_LOCATIONS[i] = null;
+                      }
+                      AUTO_TVT_OVERRIDE_TELE_BACK = Boolean.parseBoolean(properties.getProperty("TvTTeleportAfterEventSpecial", "false"));
+                      coords = new StringTokenizer(properties.getProperty("TvTTeleportSpecialLocation", ""), ",");
+                      if (coords.countTokens() == 3)
+                      {
+                              AUTO_TVT_DEFAULT_TELE_BACK = new int[3];
+                              AUTO_TVT_DEFAULT_TELE_BACK[0] = Integer.parseInt(coords.nextToken());
+                              AUTO_TVT_DEFAULT_TELE_BACK[1] = Integer.parseInt(coords.nextToken());
+                              AUTO_TVT_DEFAULT_TELE_BACK[2] = Integer.parseInt(coords.nextToken());
+                      }
+                      else
+                              AUTO_TVT_DEFAULT_TELE_BACK = null;
+                      AUTO_TVT_REWARD_MIN_POINTS = Integer.parseInt(properties.getProperty("TvTRewardedMinScore", "1"));
+                      locations = new StringTokenizer(properties.getProperty("TvTRewards", ""), ";");
+                      AUTO_TVT_REWARD_IDS = new int[locations.countTokens()];
+                      AUTO_TVT_REWARD_COUNT = new int[locations.countTokens()];
+                      for (int i = 0; i < AUTO_TVT_REWARD_IDS.length; i++)
+                      {
+                              coords = new StringTokenizer(locations.nextToken(), ",");
+                              if (coords.countTokens() == 2)
+                              {
+                                      AUTO_TVT_REWARD_IDS[i] = Integer.parseInt(coords.nextToken());
+                                      AUTO_TVT_REWARD_COUNT[i] = Integer.parseInt(coords.nextToken());
+                              }
+                              else
+                                      AUTO_TVT_REWARD_COUNT[i] = 0;
+                      }
+                      AUTO_TVT_LEVEL_MAX = Integer.parseInt(properties.getProperty("TvTMaxLevel", "85"));
+                      AUTO_TVT_LEVEL_MIN = Integer.parseInt(properties.getProperty("TvTMinLevel", "1"));
+                      AUTO_TVT_PARTICIPANTS_MAX = Integer.parseInt(properties.getProperty("TvTMaxParticipants", "25"));
+                      AUTO_TVT_PARTICIPANTS_MIN = Integer.parseInt(properties.getProperty("TvTMinParticipants", "6"));
+                      AUTO_TVT_DELAY_INITIAL_REGISTRATION = Long.parseLong(properties.getProperty("TvTDelayInitial", "900000"));
+                      AUTO_TVT_DELAY_BETWEEN_EVENTS = Long.parseLong(properties.getProperty("TvTDelayBetweenEvents", "900000"));
+                      AUTO_TVT_PERIOD_LENGHT_REGISTRATION = Long.parseLong(properties.getProperty("TvTLengthRegistration", "300000"));
+                      AUTO_TVT_PERIOD_LENGHT_PREPARATION = Long.parseLong(properties.getProperty("TvTLengthPreparation", "50000"));
+                      AUTO_TVT_PERIOD_LENGHT_EVENT = Long.parseLong(properties.getProperty("TvTLengthCombat", "240000"));
+                      AUTO_TVT_PERIOD_LENGHT_REWARDS = Long.parseLong(properties.getProperty("TvTLengthRewards", "15000"));
+                      AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT = Integer.parseInt(properties.getProperty("TvTAnnounceRegistration", "3"));
+                      AUTO_TVT_REGISTER_CURSED = Boolean.parseBoolean(properties.getProperty("TvTRegisterCursedWeaponOwner", "false"));
+                      AUTO_TVT_REGISTER_HERO = Boolean.parseBoolean(properties.getProperty("TvTRegisterHero", "true"));
+                      coords = new StringTokenizer(properties.getProperty("TvTItemsNotAllowed", ""), ",");
+                      AUTO_TVT_DISALLOWED_ITEMS = new int[coords.countTokens()];
+                      for (int i = 0; i < AUTO_TVT_DISALLOWED_ITEMS.length; i++)
+                              AUTO_TVT_DISALLOWED_ITEMS[i] = Integer.parseInt(coords.nextToken());
+                      AUTO_TVT_REGISTER_AFTER_RELOG = Boolean.parseBoolean(properties.getProperty("TvTRegisterOnRelogin", "true"));
+                      AUTO_TVT_START_CANCEL_BUFFS = Boolean.parseBoolean(properties.getProperty("TvTCancelBuffsOnStart", "false"));
+                      AUTO_TVT_START_CANCEL_CUBICS = Boolean.parseBoolean(properties.getProperty("TvTCancelCubicsOnStart", "false"));
+                      AUTO_TVT_START_CANCEL_SERVITORS = Boolean.parseBoolean(properties.getProperty("TvTCancelServitorsOnStart", "true"));
+                      AUTO_TVT_START_CANCEL_TRANSFORMATION = Boolean.parseBoolean(properties.getProperty("TvTCancelTransformationOnStart", "true"));
+                      AUTO_TVT_START_RECOVER = Boolean.parseBoolean(properties.getProperty("TvTRecoverOnStart", "true"));
+                      AUTO_TVT_GODLIKE_SYSTEM = Boolean.parseBoolean(properties.getProperty("TvTGodlikeSystem", "true"));
+                      AUTO_TVT_GODLIKE_ANNOUNCE = Boolean.parseBoolean(properties.getProperty("TvTGodlikeAnnounce", "true"));
+                      AUTO_TVT_GODLIKE_MIN_KILLS = Integer.parseInt(properties.getProperty("TvTGodlikeMinKills", "5"));
+                      AUTO_TVT_GODLIKE_POINT_MULTIPLIER = Integer.parseInt(properties.getProperty("TvTGodlikeKillPoints", "3"));
+                      AUTO_TVT_GODLIKE_TITLE = properties.getProperty("TvTGodlikeTitle", "God-like").trim();
+                      AUTO_TVT_TK_PUNISH = Boolean.parseBoolean(properties.getProperty("TvTPunishTeamKillers", "true"));
+                      AUTO_TVT_TK_PUNISH_CANCEL = Boolean.parseBoolean(properties.getProperty("TvTPunishTKCancelBuffs", "true"));
+                      AUTO_TVT_TK_RESET_GODLIKE = Boolean.parseBoolean(properties.getProperty("TvTPunishTKResetGodlike", "true"));
+                      AUTO_TVT_TK_PUNISH_POINTS_LOST = Integer.parseInt(properties.getProperty("TvTPunishTKDecreaseScore", "5"));
+                      locations = new StringTokenizer(properties.getProperty("TvTPunishTKDebuff", ""), ";");
+                      AUTO_TVT_TK_PUNISH_EFFECTS = new L2Skill[locations.countTokens()];
+                      for (int i = 0; i < AUTO_TVT_TK_PUNISH_EFFECTS.length; i++)
+                      {
+                              coords = new StringTokenizer(locations.nextToken(), ",");
+                              if (coords.countTokens() == 2)
+                              {
+                                      AUTO_TVT_TK_PUNISH_EFFECTS[i] = SkillTable.getInstance().getInfo(
+                                                      Integer.parseInt(coords.nextToken()),
+                                                      Integer.parseInt(coords.nextToken()));
+                              }
+                              else
+                                      AUTO_TVT_TK_PUNISH_EFFECTS[i] = null;
+                      }
+                      AUTO_TVT_REVIVE_SELF = Boolean.parseBoolean(properties.getProperty("TvTReviveSelf", "false"));
+                      AUTO_TVT_REVIVE_RECOVER = Boolean.parseBoolean(properties.getProperty("TvTReviveRecover", "true"));
+                      AUTO_TVT_REVIVE_DELAY = Long.parseLong(properties.getProperty("TvTReviveDelay", "5000"));
+                      AUTO_TVT_SPAWN_PROTECT = Integer.parseInt(properties.getProperty("TvTSpawnProtection", "0"));
+              }
+      }
+
        // *******************************************************************************************
 
        public static class ClassMasterSettings
Index: src/main/java/com/l2jfree/gameserver/GameServer.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/GameServer.java        (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/GameServer.java        (working copy)
@@ -122,6 +122,7 @@
 import com.l2jfree.gameserver.model.L2World;
 import com.l2jfree.gameserver.model.entity.Castle;
 import com.l2jfree.gameserver.model.entity.Hero;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.olympiad.Olympiad;
 import com.l2jfree.gameserver.model.restriction.ObjectRestrictions;
 import com.l2jfree.gameserver.network.IOFloodManager;
@@ -392,6 +393,7 @@
                {
                        _log.warn("DynamicExtension could not be loaded and initialized", ex);
                }
+              AutomatedTvT.getInstance();
               
                Util.printSection("Handlers");
                ItemHandler.getInstance();
Index: src/main/java/com/l2jfree/gameserver/handler/VoicedCommandHandler.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/handler/VoicedCommandHandler.java      (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/handler/VoicedCommandHandler.java      (working copy)
@@ -18,6 +18,7 @@
 import com.l2jfree.gameserver.handler.voicedcommandhandlers.Banking;
 import com.l2jfree.gameserver.handler.voicedcommandhandlers.CastleDoors;
 import com.l2jfree.gameserver.handler.voicedcommandhandlers.Hellbound;
+import com.l2jfree.gameserver.handler.voicedcommandhandlers.JoinEvent;
 import com.l2jfree.gameserver.handler.voicedcommandhandlers.VersionInfo;
 import com.l2jfree.gameserver.handler.voicedcommandhandlers.Wedding;
 import com.l2jfree.util.HandlerRegistry;
@@ -40,6 +41,7 @@
                        registerVoicedCommandHandler(new Banking());
                registerVoicedCommandHandler(new CastleDoors());
                registerVoicedCommandHandler(new Hellbound());
+              registerVoicedCommandHandler(new JoinEvent());
                registerVoicedCommandHandler(new VersionInfo());
                if (Config.ALLOW_WEDDING)
                        registerVoicedCommandHandler(new Wedding());
Index: src/main/java/com/l2jfree/gameserver/handler/voicedcommandhandlers/JoinEvent.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/handler/voicedcommandhandlers/JoinEvent.java  (revision 0)
+++ src/main/java/com/l2jfree/gameserver/handler/voicedcommandhandlers/JoinEvent.java  (revision 0)
@@ -0,0 +1,39 @@
+package com.l2jfree.gameserver.handler.voicedcommandhandlers;
+
+import com.l2jfree.gameserver.handler.IVoicedCommandHandler;
+import com.l2jfree.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
+
+/**
+ * @author savormix
+ *
+ */
+public class JoinEvent implements IVoicedCommandHandler
+{
+      private static final String[] CMDS = {
+              "jointvt", "joinTvT", "joinTvt"
+      };
+
+      /* (non-Javadoc)
+        * @see com.l2jfree.gameserver.handler.IVoicedCommandHandler#useVoicedCommand(java.lang.String, com.l2jfree.gameserver.model.actor.instance.L2PcInstance, java.lang.String)
+        */
+      @Override
+      public boolean useVoicedCommand(String command, L2PcInstance activeChar, String target)
+      {
+              if (command.equalsIgnoreCase(CMDS[0]))
+              {
+                      AutomatedTvT.getInstance().registerPlayer(activeChar);
+                      return true;
+              }
+              return false;
+      }
+
+      /* (non-Javadoc)
+        * @see com.l2jfree.gameserver.handler.IVoicedCommandHandler#getVoicedCommandList()
+        */
+      @Override
+      public String[] getVoicedCommandList()
+      {
+              return CMDS;
+      }
+}
Index: src/main/java/com/l2jfree/gameserver/model/actor/L2Character.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/model/actor/L2Character.java  (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/model/actor/L2Character.java  (working copy)
@@ -75,6 +75,7 @@
 import com.l2jfree.gameserver.model.actor.shot.CharShots;
 import com.l2jfree.gameserver.model.actor.stat.CharStat;
 import com.l2jfree.gameserver.model.actor.status.CharStatus;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.itemcontainer.Inventory;
 import com.l2jfree.gameserver.model.mapregion.TeleportWhereType;
 import com.l2jfree.gameserver.model.quest.Quest;
@@ -2291,7 +2292,7 @@
                                ((L2Playable) this).stopPhoenixBlessing(true);
                        }
 
-                      if(restorefull)
+                      if (restorefull)
                        {
                                //_status.setCurrentCp(getMaxCp()); //this is not confirmed...
                                _status.setCurrentHp(getMaxHp()); //confirmed
@@ -2304,6 +2305,9 @@
                                //_status.setCurrentMp(getMaxMp() * Config.RESPAWN_RESTORE_MP);
                        }
 
+                      if (this instanceof L2PcInstance)
+                              AutomatedTvT.getInstance().recover((L2PcInstance) this);
+
                        // Start broadcast status
                        broadcastPacket(new Revive(this));
 
@@ -5548,6 +5552,9 @@
                if (attackerPlayer.isInFunEvent() && targetPlayer.isInFunEvent())
                        return false;
               
+              if (AutomatedTvT.isPlaying(attackerPlayer) && AutomatedTvT.isPlaying(targetPlayer))
+                      return false;
+             
                if (attackerPlayer.getAccessLevel() >= Config.GM_PEACEATTACK)
                        return false;
               
Index: src/main/java/com/l2jfree/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/model/actor/instance/L2PcInstance.java (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -150,6 +150,7 @@
 import com.l2jfree.gameserver.model.entity.GrandBossState;
 import com.l2jfree.gameserver.model.entity.L2Event;
 import com.l2jfree.gameserver.model.entity.Siege;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.entity.events.CTF;
 import com.l2jfree.gameserver.model.entity.events.DM;
 import com.l2jfree.gameserver.model.entity.events.TvT;
@@ -3371,12 +3372,16 @@
        */
        public void setProtection(boolean protect)
        {
+              int proTime = AutomatedTvT.isPlaying(this) ? Config.AUTO_TVT_SPAWN_PROTECT : Config.PLAYER_SPAWN_PROTECTION;
+              if (protect && (proTime == 0 || isInOlympiadMode()))
+                      return;
+
                if (_log.isDebugEnabled() && (protect || _protectEndTime > 0))
                        _log.debug(getName() + ": Protection "
-                                      + (protect ? "ON " + (GameTimeController.getGameTicks() + Config.PLAYER_SPAWN_PROTECTION * GameTimeController.TICKS_PER_SECOND) : "OFF")
+                                      + (protect ? "ON " + (GameTimeController.getGameTicks() + proTime * GameTimeController.TICKS_PER_SECOND) : "OFF")
                                        + " (currently " + GameTimeController.getGameTicks() + ")");
 
-              _protectEndTime = protect ? GameTimeController.getGameTicks() + Config.PLAYER_SPAWN_PROTECTION * GameTimeController.TICKS_PER_SECOND : 0;
+              _protectEndTime = protect ? GameTimeController.getGameTicks() + proTime * GameTimeController.TICKS_PER_SECOND : 0;
        }
 
        public long getProtection()
@@ -4470,6 +4475,12 @@
                                }
                        }
 
+                      if (AutomatedTvT.isPlaying(this) && AutomatedTvT.isPlaying(pk))
+                      {
+                              srcInPvP = true;
+                              AutomatedTvT.getInstance().onKill(pk, this);
+                      }
+
                        if (!srcInPvP)
                        {
                                if (pk == null || !pk.isCursedWeaponEquipped())
@@ -4748,6 +4759,9 @@
                if (isInsideZone(L2Zone.FLAG_PVP))
                        return;
 
+              if (AutomatedTvT.isPlaying(this) && AutomatedTvT.isPlaying(targetPlayer))
+                      return;
+
                // Check if it's pvp
                if ((checkIfPvP(target) && //  Can pvp and
                                targetPlayer.getPvpFlag() != 0 // Target player has pvp flag set
@@ -4948,6 +4962,8 @@
                if ((TvT._started && _inEventTvT && player_target._inEventTvT) || (DM._started && _inEventDM && player_target._inEventDM)
                                || (CTF._started && _inEventCTF && player_target._inEventCTF) || (_inEventVIP && VIP._started && player_target._inEventVIP))
                        return;
+              if (AutomatedTvT.isPlaying(this) && AutomatedTvT.isPlaying(player_target))
+                      return;
 
                if ((isInDuel() && player_target.getDuelId() == getDuelId()))
                        return;
@@ -7695,6 +7711,10 @@
                if (isCursedWeaponEquipped())
                        return true;
 
+              if (AutomatedTvT.isPlaying(this) &&
+                              AutomatedTvT.isPlaying((L2PcInstance) attacker))
+                      return true;
+
                // Check if the attacker is in olympia and olympia start
                if (attacker instanceof L2PcInstance && ((L2PcInstance) attacker).isInOlympiadMode())
                {
@@ -8469,6 +8489,8 @@
                )
                {
                        L2PcInstance target = (L2PcInstance) obj;
+                      if (AutomatedTvT.isPlaying(this) && AutomatedTvT.isPlaying(target))
+                              return true;
                        if (skill.isPvpSkill()) // Pvp skill
                        {
                                if (getClan() != null && target.getClan() != null)
@@ -10722,8 +10744,7 @@
               
                getKnownList().updateKnownObjects();
               
-              if ((Config.PLAYER_SPAWN_PROTECTION > 0) && !isInOlympiadMode())
-                      setProtection(true);
+              setProtection(true);
 
                // Trained beast is after teleport lost
                if (getTrainedBeast() != null)
@@ -11083,6 +11104,7 @@
               
                abortCast();
                abortAttack();
+              AutomatedTvT.getInstance().onDisconnection(this);
 
                try
                {
@@ -14008,10 +14030,50 @@
                        sendMessage("You can't teleport during Observation Mode.");
                        return false;
                }
+
+              if (AutomatedTvT.isPlaying(this))
+              {
+                      sendPacket(SystemMessageId.NOT_WORKING_PLEASE_TRY_AGAIN_LATER);
+                      return false;
+              }
               
                return true;
        }
 
+      private int killsWithoutDeath = 0;
+      private int points = 0;
+      private int team = -1;
+
+      public final int getKillsWithoutDeath()
+      {
+              return killsWithoutDeath;
+      }
+
+      public final void setKillsWithoutDeath(int val)
+      {
+              killsWithoutDeath = val;
+      }
+
+      public final int getEventPoints()
+      {
+              return points;
+      }
+
+      public final void setEventPoints(int val)
+      {
+              points = val;
+      }
+
+      public final int getEventTeam()
+      {
+              return team;
+      }
+
+      public final void setEventTeam(int val)
+      {
+              team = val;
+      }
+
        public boolean canSee(L2Character cha)
        {
                if (isGM())
Index: src/main/java/com/l2jfree/gameserver/model/entity/events/AutomatedTvT.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/model/entity/events/AutomatedTvT.java  (revision 0)
+++ src/main/java/com/l2jfree/gameserver/model/entity/events/AutomatedTvT.java  (revision 0)
@@ -0,0 +1,706 @@
+package com.l2jfree.gameserver.model.entity.events;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.concurrent.ScheduledFuture;
+
+import javolution.util.FastList;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.l2jfree.Config;
+import com.l2jfree.L2DatabaseFactory;
+import com.l2jfree.gameserver.Announcements;
+import com.l2jfree.gameserver.ThreadPoolManager;
+import com.l2jfree.gameserver.model.L2ItemInstance;
+import com.l2jfree.gameserver.model.L2Skill;
+import com.l2jfree.gameserver.model.Location;
+import com.l2jfree.gameserver.model.actor.instance.L2CubicInstance;
+import com.l2jfree.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jfree.gameserver.model.olympiad.Olympiad;
+import com.l2jfree.gameserver.model.zone.L2Zone;
+import com.l2jfree.gameserver.network.SystemChatChannelId;
+import com.l2jfree.gameserver.network.SystemMessageId;
+import com.l2jfree.gameserver.network.serverpackets.CreatureSay;
+import com.l2jfree.gameserver.network.serverpackets.SystemMessage;
+import com.l2jfree.gameserver.util.Broadcast;
+import com.l2jfree.tools.random.Rnd;
+
+/**
+ * @author savormix
+ */
+public final class AutomatedTvT
+{
+      private static final Log _log = LogFactory.getLog(AutomatedTvT.class);
+      private static final String REMOVE_DISCONNECTED_PLAYER = "UPDATE characters SET heading=?,x=?,y=?,z=?,title=? WHERE charId=?";
+      private static final String evtName = "Team versus team";
+
+      //when the event has ended and not yet started
+      private static final int STATUS_NOT_IN_PROGRESS = 0;
+      //registration in progress
+      private static final int STATUS_REGISTRATION    = 1;
+      //registration ended, players frozen & teled to the place, waiting for them to appear
+      private static final int STATUS_PREPARATION            = 2;
+      //players are allowed to fight
+      private static final int STATUS_COMBAT                  = 3;
+      //players are frozen, rewarded and teled back to where they were
+      private static final int STATUS_REWARDS                = 4;
+
+      private static AutomatedTvT instance = null;
+
+      public static final AutomatedTvT getInstance()
+      {
+              if (instance == null)
+                      instance = new AutomatedTvT();
+              return instance;
+      }
+
+      /**
+        * Called when configuration is reloaded and {@link Config#AUTO_TVT_ENABLED} = true<BR>
+        * <CODE>instance</CODE> will only be <CODE>null</CODE> when the config is loaded during
+        * server startup, and we don't want the event to start countdown THAT early.<BR>
+        * <I>Normally initialization is called when loading [static] extensions.</I>
+        */
+      public static final void startIfNecessary()
+      {
+              if (instance != null && !instance.active)
+                      instance.tpm.scheduleGeneral(instance.task, Config.AUTO_TVT_DELAY_INITIAL_REGISTRATION);
+      }
+
+      private final ThreadPoolManager tpm;
+
+      private final AutoEventTask task;
+      private final AutoReviveTask taskDuring;
+      private ScheduledFuture<?> reviver;
+      private ScheduledFuture<?> event;
+
+      private final FastList<Integer> registered;
+      private final FastList<L2PcInstance> participants;
+      private int[] partOIDs = null;
+      private int[] partTeams = null;
+      private Location[] partLocs = null;
+      private String[] partTitles = null;
+      private int[] partColors = null;
+      private L2PcInstance[] part = null;
+      private boolean[] partTKs = null;
+
+      private int status;
+      private boolean active;
+      private int announced;
+
+      private int[] teamPts = null;
+      private int[] teamCR = null;
+      private int[] teamCG = null;
+      private int[] teamCB = null;
+
+      private AutomatedTvT()
+      {
+              tpm = ThreadPoolManager.getInstance();
+              status = STATUS_NOT_IN_PROGRESS;
+              announced = 0;
+              participants = new FastList<L2PcInstance>(10);
+              registered = new FastList<Integer>(10);
+              task = new AutoEventTask();
+              taskDuring = new AutoReviveTask();
+              reviver = null;
+              active = Config.AUTO_TVT_ENABLED;
+              if (active)
+                      tpm.scheduleGeneral(task, Config.AUTO_TVT_DELAY_INITIAL_REGISTRATION);
+              _log.info("AutomatedTvT: initialized.");
+      }
+
+      private class AutoEventTask implements Runnable
+      {
+              @Override
+              public void run()
+              {
+                      switch (status)
+                      {
+                      case STATUS_NOT_IN_PROGRESS:
+                              if (Config.AUTO_TVT_ENABLED)
+                                      registrationStart();
+                              else
+                                      active = false;
+                              break;
+                      case STATUS_REGISTRATION:
+                              if (announced < (Config.AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT + 2))
+                                      registrationAnnounce();
+                              else
+                                      registrationEnd();
+                              break;
+                      case STATUS_PREPARATION:
+                              eventStart();
+                              break;
+                      case STATUS_COMBAT:
+                              eventEnd();
+                              break;
+                      case STATUS_REWARDS:
+                              status = STATUS_NOT_IN_PROGRESS;
+                              tpm.scheduleGeneral(task, Config.AUTO_TVT_DELAY_BETWEEN_EVENTS);
+                              break;
+                      default:
+                              _log.fatal("Incorrect status set in Automated " + evtName + ", terminating the event!");
+                      }
+              }
+      }
+
+      private class AutoReviveTask implements Runnable
+      {
+              @Override
+              public void run()
+              {
+                      if (part == null)
+                              return;
+                      for (L2PcInstance p : part)
+                              if (p != null && p.isDead())
+                                      revive(p);
+              }
+      }
+
+      private final void registrationStart()
+      {
+              status = STATUS_REGISTRATION;
+              Announcements.getInstance().announceToAll(SystemMessageId.REGISTRATION_PERIOD);
+              SystemMessage time = new SystemMessage(SystemMessageId.REGISTRATION_TIME_S1_S2_S3);
+              long timeLeft = Config.AUTO_TVT_PERIOD_LENGHT_REGISTRATION / 1000;
+              time.addNumber(timeLeft / 3600);
+              time.addNumber(timeLeft % 3600 / 60);
+              time.addNumber(timeLeft % 3600 % 60);
+              Broadcast.toAllOnlinePlayers(time);
+              Announcements.getInstance().announceToAll("To join the " + evtName + " you must type .jointvt");
+              tpm.scheduleGeneral(task, Config.AUTO_TVT_PERIOD_LENGHT_REGISTRATION / (Config.AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT + 2));
+      }
+
+      private final void registrationAnnounce()
+      {
+              SystemMessage time = new SystemMessage(SystemMessageId.REGISTRATION_TIME_S1_S2_S3);
+              long timeLeft = Config.AUTO_TVT_PERIOD_LENGHT_REGISTRATION;
+              long elapsed = timeLeft / (Config.AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT + 2) * announced;
+              timeLeft -= elapsed;
+              timeLeft /= 1000;
+              time.addNumber(timeLeft / 3600);
+              time.addNumber(timeLeft % 3600 / 60);
+              time.addNumber(timeLeft % 3600 % 60);
+              Broadcast.toAllOnlinePlayers(time);
+              Announcements.getInstance().announceToAll("To join the " + evtName + " you must type .jointvt");
+              announced++;
+              tpm.scheduleGeneral(task, Config.AUTO_TVT_PERIOD_LENGHT_REGISTRATION / (Config.AUTO_TVT_REGISTRATION_ANNOUNCEMENT_COUNT + 2));
+      }
+
+      private final void registrationEnd()
+      {
+              announced = 0;
+              status = STATUS_PREPARATION;
+
+              registered.clear();
+
+              L2PcInstance[] reged = participants.toArray(new L2PcInstance[participants.size()]);
+              for (L2PcInstance player : reged)
+              {
+                      if (!canJoin(player))
+                      {
+                              player.sendMessage("You no longer meet the requirements to join " + evtName);
+                              participants.remove(player);
+                      }
+              }
+              reged = null;
+
+              if (participants.size() < Config.AUTO_TVT_PARTICIPANTS_MIN)
+              {
+                      Announcements.getInstance().announceToAll(evtName + " will not start, not enough players!");
+                      participants.clear();
+                      status = STATUS_NOT_IN_PROGRESS;
+                      tpm.scheduleGeneral(task, Config.AUTO_TVT_DELAY_BETWEEN_EVENTS);
+                      return;
+              }
+
+              teamPts = new int[Config.AUTO_TVT_TEAM_LOCATIONS.length];
+              teamCR = new int[Config.AUTO_TVT_TEAM_LOCATIONS.length];
+              teamCG = new int[Config.AUTO_TVT_TEAM_LOCATIONS.length];
+              teamCB = new int[Config.AUTO_TVT_TEAM_LOCATIONS.length];
+              int[] temp;
+              for (int i = 0; i < teamPts.length; i++)
+              {
+                      teamPts[i] = 0;
+                      temp = correctColor(teamCR, teamCG, teamCB,
+                                      Rnd.get(256), Rnd.get(256), Rnd.get(256), i);
+                      teamCR[i] = temp[0];
+                      teamCG[i] = temp[1];
+                      teamCB[i] = temp[2];
+              }
+
+              int currTeam = 0;
+              part = participants.toArray(new L2PcInstance[participants.size()]);
+              participants.clear();
+              partOIDs = new int[part.length];
+              partTeams = new int[partOIDs.length];
+              partLocs = new Location[partOIDs.length];
+              partTitles = new String[partOIDs.length];
+              partColors = new int[partOIDs.length];
+              partTKs = new boolean[partOIDs.length];
+              SystemMessage time = new SystemMessage(SystemMessageId.BATTLE_BEGINS_S1_S2_S3);
+              long timeLeft = Config.AUTO_TVT_PERIOD_LENGHT_PREPARATION / 1000;
+              time.addNumber(timeLeft / 3600);
+              time.addNumber(timeLeft % 3600 / 60);
+              time.addNumber(timeLeft % 3600 % 60);
+              for (int i = 0; i < partOIDs.length; i++)
+              {
+                      L2PcInstance player = part[i];
+                      partOIDs[i] = player.getObjectId();
+                      partTeams[i] = currTeam;
+                      player.setEventTeam(currTeam);
+                      partLocs[i] = player.getLoc();
+                      partTitles[i] = player.getTitle();
+                      partColors[i] = player.getAppearance().getNameColor();
+                      player.getAppearance().setNameColor((teamCR[currTeam] & 0xFF) +
+                                      (teamCG[currTeam] << 8) + (teamCB[currTeam] << 16));
+                      partTKs[i] = false;
+                      player.setIsPetrified(true);
+                      player.sendPacket(time);
+                      checkEquipment(player);
+                      if (Config.AUTO_TVT_START_CANCEL_BUFFS)
+                              player.stopAllEffects();
+                      if (Config.AUTO_TVT_START_CANCEL_CUBICS && !player.getCubics().isEmpty())
+                      {
+                              for (L2CubicInstance cubic : player.getCubics().values())
+                              {
+                                      cubic.stopAction();
+                                      cubic.cancelDisappear();
+                              }
+                              player.getCubics().clear();
+                      }
+                      if (Config.AUTO_TVT_START_CANCEL_SERVITORS && player.getPet() != null)
+                              player.getPet().unSummon();
+                      if (Config.AUTO_TVT_START_CANCEL_TRANSFORMATION && player.isTransformed())
+                              player.untransform();
+                      if (player.isDead())
+                              player.setIsPendingRevive(true);
+                      player.teleToLocation(Config.AUTO_TVT_TEAM_LOCATIONS[currTeam][0],
+                                      Config.AUTO_TVT_TEAM_LOCATIONS[currTeam][1],
+                                      Config.AUTO_TVT_TEAM_LOCATIONS[currTeam][2]);
+                      if (Config.AUTO_TVT_START_RECOVER)
+                      {
+                              player.getStatus().setCurrentCp(player.getMaxCp());
+                              player.getStatus().setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
+                      }
+                      currTeam++;
+                      if (currTeam == teamPts.length)
+                              currTeam = 0;
+              }
+              tpm.scheduleGeneral(task, Config.AUTO_TVT_PERIOD_LENGHT_PREPARATION);
+      }
+
+      private final void eventStart()
+      {
+              status = STATUS_COMBAT;
+              SystemMessage time = new SystemMessage(SystemMessageId.BATTLE_ENDS_S1_S2_S3);
+              long timeLeft = Config.AUTO_TVT_PERIOD_LENGHT_EVENT / 1000;
+              time.addNumber(timeLeft / 3600);
+              time.addNumber(timeLeft % 3600 / 60);
+              time.addNumber(timeLeft % 3600 % 60);
+              for (int i = 0; i < partOIDs.length; i++)
+              {
+                      L2PcInstance player = part[i];
+                      player.setIsPetrified(false);
+                      player.sendPacket(time);
+                      updatePlayerTitle(player, false);
+              }
+              reviver = tpm.scheduleAtFixedRate(taskDuring, Config.AUTO_TVT_REVIVE_DELAY, Config.AUTO_TVT_REVIVE_DELAY);
+              event = tpm.scheduleGeneral(task, Config.AUTO_TVT_PERIOD_LENGHT_EVENT);
+      }
+
+      private final void eventEnd()
+      {
+              if (status != STATUS_COMBAT)
+                      return;
+              status = STATUS_REWARDS;
+              reviver.cancel(true);
+              if (!event.cancel(false))
+                      return;
+              int winnerTeam = getWinnerTeam();
+
+              if (winnerTeam != -1)
+              {
+                      Announcements.getInstance().announceToAll(evtName + ": Team " +
+                                      (winnerTeam + 1) + "wins!");
+                      Announcements.getInstance().announceToAll(evtName + ": Cumulative score: " +
+                                      teamPts[winnerTeam]);
+              }
+              else
+                      Announcements.getInstance().announceToAll(evtName + ": There is no winner team.");
+
+              for (int i = 0; i < part.length; i++)
+              {
+                      if (part[i] == null)
+                      {
+                              removeDisconnected(partOIDs[i], partLocs[i], partTitles[i]);
+                              continue;
+                      }
+
+                      if (part[i].getEventTeam() == winnerTeam &&
+                                      part[i].getEventPoints() >= Config.AUTO_TVT_REWARD_MIN_POINTS)
+                              reward(part[i]);
+
+                      part[i].setTitle(partTitles[i]);
+                      part[i].getAppearance().setNameColor(partColors[i]);
+                      part[i].setEventPoints(0);
+                      part[i].setEventTeam(-1);
+                      if (part[i].isDead())
+                              part[i].setIsPendingRevive(true);
+
+                      if (Config.AUTO_TVT_OVERRIDE_TELE_BACK)
+                              part[i].teleToLocation(Config.AUTO_TVT_DEFAULT_TELE_BACK[0],
+                                              Config.AUTO_TVT_DEFAULT_TELE_BACK[1],
+                                              Config.AUTO_TVT_DEFAULT_TELE_BACK[2]);
+                      else
+                              part[i].teleToLocation(partLocs[i], true);
+                      part[i].getStatus().setCurrentCp(part[i].getMaxCp());
+                      part[i].getStatus().setCurrentHpMp(part[i].getMaxHp(), part[i].getMaxMp());
+              }
+              tpm.scheduleGeneral(task, Config.AUTO_TVT_PERIOD_LENGHT_REWARDS);
+      }
+
+      public final void addDisconnected(L2PcInstance participant)
+      {
+              switch (status)
+              {
+              case STATUS_REGISTRATION:
+                      if (Config.AUTO_TVT_REGISTER_AFTER_RELOG &&
+                                      registered.remove(participant.getObjectId()))
+                              registerPlayer(participant);
+                      break;
+              case STATUS_COMBAT:
+                      for (int i = 0; i < partOIDs.length; i++)
+                      {
+                              if (partOIDs[i] == participant.getObjectId())
+                              {
+                                      part[i] = participant;
+                                      participant.setEventTeam(partTeams[i]);
+                                      if (partTKs[i])
+                                              participant.setEventPoints(0 - Config.AUTO_TVT_TK_PUNISH_POINTS_LOST);
+                                      participant.getAppearance().setNameColor(teamCR[partTeams[i]] +
+                                                      teamCG[partTeams[i]] << 8 + teamCB[partTeams[i]] << 16);
+                                      updatePlayerTitle(participant, false);
+                                      checkEquipment(participant);
+                                      participant.teleToLocation(Config.AUTO_TVT_TEAM_LOCATIONS[partTeams[i]][0],
+                                                      Config.AUTO_TVT_TEAM_LOCATIONS[partTeams[i]][1],
+                                                      Config.AUTO_TVT_TEAM_LOCATIONS[partTeams[i]][2]);
+                                      break;
+                              }
+                      }
+                      break;
+              }
+      }
+
+      private final void checkEquipment(L2PcInstance player)
+      {
+              L2ItemInstance item;
+              for (int i = 0; i < 25; i++)
+              {
+                      synchronized (player.getInventory())
+                      {
+                              item = player.getInventory().getPaperdollItem(i);
+                              if (item != null && !canUse(item.getItemId()))
+                                      player.useEquippableItem(item, true);
+                      }
+              }
+      }
+
+      public static final boolean canUse(int itemId)
+      {
+              for (int id : Config.AUTO_TVT_DISALLOWED_ITEMS)
+                      if (itemId == id)
+                              return false;
+              return true;
+      }
+
+      private final int getWinnerTeam()
+      {
+              int maxPts = 0, winTeam = -1;
+              for (int i = 0; i < teamPts.length; i++)
+              {
+                      if (teamPts[i] > maxPts)
+                      {
+                              maxPts = teamPts[i];
+                              winTeam = i;
+                      }
+              }
+              return winTeam;
+      }
+
+      private final void reward(L2PcInstance player)
+      {
+              for (int i = 0; i < Config.AUTO_TVT_REWARD_IDS.length; i++)
+              {
+                      player.addItem("TvT Reward", Config.AUTO_TVT_REWARD_IDS[i],
+                                      Config.AUTO_TVT_REWARD_COUNT[i], null, false, true);
+                      player.sendPacket(new SystemMessage(SystemMessageId.CONGRATULATIONS_RECEIVED_S1).addItemName(Config.AUTO_TVT_REWARD_IDS[i]));
+              }
+      }
+
+      public static final boolean isInProgress()
+      {
+              switch (getInstance().status)
+              {
+              case STATUS_PREPARATION:
+              case STATUS_COMBAT:
+                      return true;
+              default:
+                      return false;
+              }
+      }
+
+      public static final boolean isReged(L2PcInstance player)
+      {
+              return getInstance().isMember(player);
+      }
+
+      public static final boolean isPlaying(L2PcInstance player)
+      {
+              return isInProgress() && isReged(player);
+      }
+
+      public final boolean isMember(L2PcInstance player)
+      {
+              if (player == null)
+                      return false;
+
+              switch (status)
+              {
+              case STATUS_NOT_IN_PROGRESS:
+                      return false;
+              case STATUS_REGISTRATION:
+                      return participants.contains(player);
+              case STATUS_PREPARATION:
+                      return participants.contains(player) || isMember(player.getObjectId());
+              case STATUS_COMBAT:
+              case STATUS_REWARDS:
+                      return isMember(player.getObjectId());
+              default:
+                      return false;
+              }
+      }
+
+      private final boolean isMember(int oID)
+      {
+              for (int id : partOIDs)
+                      if (id == oID)
+                              return true;
+              return false;
+      }
+
+      private final boolean canJoin(L2PcInstance player)
+      {
+              // Level restrictions
+              boolean can = player.getLevel() <= Config.AUTO_TVT_LEVEL_MAX;
+              can &= player.getLevel() >= Config.AUTO_TVT_LEVEL_MIN;
+              // Cannot mess with Olympiad
+              can &= !(player.isInOlympiadMode() || Olympiad.getInstance().isRegistered(player));
+              // Cannot mess with raids or sieges
+              can &= !player.isInsideZone(L2Zone.FLAG_NOESCAPE);
+              can &= !(player.getMountType() == 2 && player.isInsideZone(L2Zone.FLAG_NOLANDING));
+              // Hero restriction
+              if (!Config.AUTO_TVT_REGISTER_HERO)
+                      can &= !player.isHero();
+              // Cursed weapon owner restriction
+              if (!Config.AUTO_TVT_REGISTER_CURSED)
+                      can &= !player.isCursedWeaponEquipped();
+              return can;
+      }
+
+      public final void registerPlayer(L2PcInstance player)
+      {
+              if (status != STATUS_REGISTRATION ||
+                              participants.size() >= Config.AUTO_TVT_PARTICIPANTS_MAX)
+                      player.sendPacket(SystemMessageId.REGISTRATION_PERIOD_OVER);
+              else if (!participants.contains(player))
+              {
+                      if (!canJoin(player))
+                      {
+                              player.sendMessage("You do not meet the requirements to join " + evtName);
+                              return;
+                      }
+                      participants.add(player);
+                      registered.add(player.getObjectId());
+                      player.sendMessage("You have been registered to " + evtName);
+              }
+              else
+                      player.sendMessage("Already registered!");
+      }
+
+      public final void onKill(L2PcInstance killer, L2PcInstance victim)
+      {
+              if (status != STATUS_COMBAT || !isMember(killer) || !isMember(victim))
+                      return;
+              victim.setKillsWithoutDeath(0);
+              if (killer.getEventTeam() != victim.getEventTeam())
+              {
+                      if (Config.AUTO_TVT_GODLIKE_SYSTEM &&
+                                      killer.getKillsWithoutDeath() >= Config.AUTO_TVT_GODLIKE_MIN_KILLS)
+                      {
+                              killer.setEventPoints(killer.getEventPoints() + Config.AUTO_TVT_GODLIKE_POINT_MULTIPLIER);
+                              updatePlayerTitle(killer, true);
+                              if (Config.AUTO_TVT_GODLIKE_ANNOUNCE)
+                              {
+                                      CreatureSay cs = new CreatureSay(0, SystemChatChannelId.Chat_Shout,
+                                                      evtName, killer.getName() + ": God-like!");
+                                      for (L2PcInstance p : part)
+                                              p.sendPacket(cs);
+                              }
+                      }
+                      else
+                      {
+                              killer.setEventPoints(killer.getEventPoints() + 1);
+                              updatePlayerTitle(killer, false);
+                      }
+                      teamPts[killer.getEventTeam()]++;
+                      killer.setKillsWithoutDeath(killer.getKillsWithoutDeath() + 1);
+                      victim.setEventPoints(victim.getEventPoints() - 1);
+              }
+              else if (Config.AUTO_TVT_TK_PUNISH)
+              {
+                      for (int i = 0; i < part.length; i++)
+                              if (part[i] == killer)
+                                      partTKs[i] = true;
+                      killer.setEventPoints(killer.getEventPoints() - Config.AUTO_TVT_TK_PUNISH_POINTS_LOST);
+                      if (Config.AUTO_TVT_TK_PUNISH_CANCEL)
+                              killer.stopAllEffects();
+                      if (Config.AUTO_TVT_TK_RESET_GODLIKE)
+                              killer.setKillsWithoutDeath(0);
+                      if (Config.AUTO_TVT_TK_PUNISH_EFFECTS != null)
+                      {
+                              for (L2Skill s : Config.AUTO_TVT_TK_PUNISH_EFFECTS)
+                              {
+                                      if (s == null) continue;
+                                      if (killer.getFirstEffect(s) != null)
+                                              killer.getFirstEffect(s).exit();
+                                      s.getEffects(killer, killer);
+                              }
+                      }
+                      updatePlayerTitle(killer, false);
+              }
+              updatePlayerTitle(victim, false);
+      }
+
+      public final void revive(L2PcInstance participant)
+      {
+              participant.setIsPendingRevive(true);
+              participant.teleToLocation(Config.AUTO_TVT_TEAM_LOCATIONS[participant.getEventTeam()][0],
+                              Config.AUTO_TVT_TEAM_LOCATIONS[participant.getEventTeam()][1],
+                              Config.AUTO_TVT_TEAM_LOCATIONS[participant.getEventTeam()][2]);
+      }
+
+      public final void recover(L2PcInstance revived)
+      {
+              if (Config.AUTO_TVT_REVIVE_RECOVER && isPlaying(revived))
+              {
+                      revived.getStatus().setCurrentCp(revived.getMaxCp());
+                      revived.getStatus().setCurrentHpMp(revived.getMaxHp(), revived.getMaxMp());
+              }
+      }
+
+      private final void updatePlayerTitle(L2PcInstance player, boolean godlike)
+      {
+              if (godlike)
+                      player.setTitle(Config.AUTO_TVT_GODLIKE_TITLE);
+              else
+                      player.setTitle("Score: " + player.getEventPoints());
+              player.broadcastTitleInfo();
+      }
+
+      public final void onDisconnection(L2PcInstance player)
+      {
+              if (!isReged(player))
+                      return;
+              switch (status)
+              {
+              case STATUS_REGISTRATION:
+                      participants.remove(player);
+                      break;
+              case STATUS_COMBAT:
+              case STATUS_REWARDS:
+                      for (int i = 0; i < part.length; i++)
+                              if (part[i] == player)
+                              {
+                                      part[i] = null;
+                                      if (countTeamMembers(player.getEventTeam()) == 0)
+                                              eventEnd();
+                              }
+                      break;
+              }
+      }
+
+      private final int countTeamMembers(int team)
+      {
+              int result = 0;
+              for (L2PcInstance p : part)
+                      if (p != null && p.getEventTeam() == team)
+                              result++;
+              return result;
+      }
+
+      private final void removeDisconnected(int objID, Location loc, String title)
+      {
+              Connection con = null;
+              try
+              {
+                      con = L2DatabaseFactory.getInstance().getConnection();
+                      PreparedStatement ps = con.prepareStatement(REMOVE_DISCONNECTED_PLAYER);
+                      ps.setInt(1, loc.getHeading());
+                      if (Config.AUTO_TVT_OVERRIDE_TELE_BACK)
+                      {
+                              ps.setInt(2, Config.AUTO_TVT_DEFAULT_TELE_BACK[0]);
+                              ps.setInt(3, Config.AUTO_TVT_DEFAULT_TELE_BACK[1]);
+                              ps.setInt(4, Config.AUTO_TVT_DEFAULT_TELE_BACK[2]);
+                      }
+                      else
+                      {
+                              ps.setInt(2, loc.getX());
+                              ps.setInt(3, loc.getY());
+                              ps.setInt(4, loc.getZ());
+                      }
+                      ps.setString(5, title);
+                      ps.setInt(6, objID);
+                      ps.executeUpdate();
+                      ps.close();
+              }
+              catch (SQLException e)
+              {
+                      _log.error("Could not remove a disconnected TvT player!", e);
+              }
+              finally
+              {
+                      L2DatabaseFactory.close(con);
+              }
+      }
+
+      private final int[] correctColor(int[] r, int[] g, int[] b, int rn, int gn, int bn,
+                      int current) {
+              int[] result = { rn, gn, bn };
+              // Possible to do fast enough even if there are 32+ teams,
+              // But I don't think this "blind shot" idea is suited for that
+              if (Config.AUTO_TVT_TEAM_LOCATIONS.length > 32 || current == 0)
+                      return result;
+
+              // TODO: calibrate the multiplier
+              int totalDiff, noticeable = (256 * 2) / Config.AUTO_TVT_TEAM_LOCATIONS.length;
+              while (true)
+              {
+                      for (int i = 0; i < current; i++)
+                      {
+                              totalDiff = (Math.abs(result[0] - r[i]) + Math.abs(result[1] - g[i]) +
+                                              Math.abs(result[2] - b[i]));
+                              if (totalDiff < noticeable)
+                              {
+                                      result[0] = Rnd.get(256);
+                                      result[1] = Rnd.get(256);
+                                      result[2] = Rnd.get(256);
+                              }
+                              else
+                                      return result;
+                      }
+              }
+      }
+}
Index: src/main/java/com/l2jfree/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/network/clientpackets/EnterWorld.java  (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/network/clientpackets/EnterWorld.java  (working copy)
@@ -47,6 +47,7 @@
 import com.l2jfree.gameserver.model.entity.Hero;
 import com.l2jfree.gameserver.model.entity.L2Event;
 import com.l2jfree.gameserver.model.entity.Siege;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.mapregion.TeleportWhereType;
 import com.l2jfree.gameserver.model.olympiad.Olympiad;
 import com.l2jfree.gameserver.model.quest.Quest;
@@ -222,6 +223,8 @@
                        // no broadcast needed since the player will already spawn dead to others
                        sendPacket(new Die(activeChar));
 
+              AutomatedTvT.getInstance().addDisconnected(activeChar);
+
                // engage and notify Partner
                if (Config.ALLOW_WEDDING)
                {
Index: src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestGiveNickName.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestGiveNickName.java (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestGiveNickName.java (working copy)
@@ -18,6 +18,7 @@
 import com.l2jfree.gameserver.model.L2Clan;
 import com.l2jfree.gameserver.model.L2ClanMember;
 import com.l2jfree.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.network.SystemMessageId;
 import com.l2jfree.gameserver.network.serverpackets.ActionFailed;
 import com.l2jfree.gameserver.network.serverpackets.SystemMessage;
@@ -76,6 +77,11 @@
                        requestFailed(SystemMessageId.PLEASE_INPUT_TITLE_LESS_128_CHARACTERS);
                        return;
                }
+              else if (AutomatedTvT.isPlaying(activeChar))
+              {
+                      requestFailed(SystemMessageId.NOT_WORKING_PLEASE_TRY_AGAIN_LATER);
+                      return;
+              }
 
                L2ClanMember targetMember = activeChar.getClan().getClanMember(_target);
                if (targetMember == null)
Index: src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestRestartPoint.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestRestartPoint.java (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/network/clientpackets/RequestRestartPoint.java (working copy)
@@ -18,6 +18,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import com.l2jfree.Config;
 import com.l2jfree.gameserver.ThreadPoolManager;
 import com.l2jfree.gameserver.instancemanager.CastleManager;
 import com.l2jfree.gameserver.instancemanager.ClanHallManager;
@@ -33,6 +34,7 @@
 import com.l2jfree.gameserver.model.entity.Fort;
 import com.l2jfree.gameserver.model.entity.FortSiege;
 import com.l2jfree.gameserver.model.entity.Siege;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.mapregion.TeleportWhereType;
 import com.l2jfree.gameserver.model.zone.L2Zone;
 
@@ -229,6 +231,8 @@
                        _log.warn("Living player [" + activeChar.getName() + "] called RestartPointPacket! Ban this player!");
                        return;
                }
+              else if (AutomatedTvT.isPlaying(activeChar) && !Config.AUTO_TVT_REVIVE_SELF)
+                      return;
 
                Castle castle = CastleManager.getInstance().getCastle(activeChar.getX(), activeChar.getY(), activeChar.getZ());
                if (castle != null && castle.getSiege().getIsInProgress())
Index: src/main/java/com/l2jfree/gameserver/network/clientpackets/UseItem.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/network/clientpackets/UseItem.java    (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/network/clientpackets/UseItem.java    (working copy)
@@ -23,6 +23,7 @@
 import com.l2jfree.gameserver.instancemanager.FortSiegeManager;
 import com.l2jfree.gameserver.model.L2ItemInstance;
 import com.l2jfree.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 import com.l2jfree.gameserver.model.itemcontainer.Inventory;
 import com.l2jfree.gameserver.network.SystemMessageId;
 import com.l2jfree.gameserver.network.serverpackets.ActionFailed;
@@ -170,6 +171,12 @@
                if (itemId == 57)
                        return;
 
+              if (AutomatedTvT.isPlaying(activeChar) && !AutomatedTvT.canUse(itemId))
+              {
+                      requestFailed(SystemMessageId.NOT_WORKING_PLEASE_TRY_AGAIN_LATER);
+                      return;
+              }
+
                if (activeChar.isFishing() && !ShotTable.getInstance().isFishingShot(itemId))
                {
                        // You cannot do anything else while fishing
Index: src/main/java/com/l2jfree/gameserver/network/serverpackets/Die.java
===================================================================
--- src/main/java/com/l2jfree/gameserver/network/serverpackets/Die.java (revision 5950)
+++ src/main/java/com/l2jfree/gameserver/network/serverpackets/Die.java (working copy)
@@ -24,6 +24,7 @@
 import com.l2jfree.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jfree.gameserver.model.entity.FortSiege;
 import com.l2jfree.gameserver.model.entity.Siege;
+import com.l2jfree.gameserver.model.entity.events.AutomatedTvT;
 
 /**
  * sample
@@ -104,7 +105,17 @@
 
                writeC(0x0);
               
-              writeD(_charObjId);
+              writeD(_charObjId);
+
+              if (_activeChar instanceof L2PcInstance && !((L2PcInstance) _activeChar).isGM() &&
+                              AutomatedTvT.isPlaying((L2PcInstance) _activeChar) &&
+                              !Config.AUTO_TVT_REVIVE_SELF)
+              {
+                      for (int i = 0; i < 7; i++)
+                              writeD(00);
+                      return;
+              }
+
                writeD(_showVillage);
                writeD(_showClanhall);
                writeD(_showCastle);

Creditos: savorimix.

newsamael 21-02-2011 11:32 AM

Todo este código, é adcionado no java?
em muita manha nisto não, onde vejo um tuto de como add ete mod.

lordslip 21-02-2011 06:41 PM

Si nao for emcomodo, quais as diferenciais, vi algumas como kill reward, team reward etc.... gostaria se tem como colocar pra tipo, player afk, digitar .afk i ele receber na tela dele um aviso, si ele nao responder, ou demorar +d 2-3min pra responder leva kick do evento ital... mais tem mais?

Daniel2 22-02-2011 01:14 PM

newsamael sim caro amigo esse codigo é adicionado no java.

Lordslip sim mano tem como colocar sim mais você tem que adicionar o codigo no java com esse comando tem que fazer e uma coisa tem muita diferença tem eventos que são para servers retail que é o tvt esses que você falou são custom são novos adicionados no server.


Horários baseados na GMT -3. Agora são 12:55 AM.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.