U3Games
Lineage II | Desarrollo & Soporte => Implementaciones => Desarrollo de Servidores => Eventos => Mensaje iniciado por: Swarlog en Ago 06, 2022, 02:07 AM
CitarCORE:
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (revision 3755)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -136,6 +136,7 @@
import com.l2jserver.gameserver.model.base.PlayerClass;
import com.l2jserver.gameserver.model.base.Race;
import com.l2jserver.gameserver.model.base.SubClass;
+import com.l2jserver.gameserver.model.entity.Biohazard;
import com.l2jserver.gameserver.model.entity.Castle;
import com.l2jserver.gameserver.model.entity.Duel;
import com.l2jserver.gameserver.model.entity.Fort;
@@ -323,6 +324,7 @@
};
private static final int[] COMMON_CRAFT_LEVELS = { 5, 20, 28, 36, 43, 49, 55, 62 };
+ private static boolean _inBiohazard = false;
public class AIAccessor extends L2Character.AIAccessor
{
@@ -527,7 +529,19 @@
private int _obsY;
private int _obsZ;
private boolean _observerMode = false;
+
+ public boolean _isZombie = false;
+ public void setIsZombie(boolean a)
+ {
+ _isZombie = a;
+ }
+
+ public boolean isZombie()
+ {
+ return _isZombie;
+ }
+
/** Stored from last ValidatePosition **/
private Point3D _lastServerPosition = new Point3D(0, 0, 0);
@@ -4991,6 +5005,8 @@
public void untransform()
{
+ if (inBiohazard() && Biohazard.isStarted() && _transformation != null && isZombie())
+ return;
if (_transformation != null)
{
setTransformAllowedSkills(new int[]{});
@@ -5432,6 +5448,22 @@
if (!super.doDie(killer))
return false;
+ if (killer instanceof L2PcInstance)
+ {
+ L2PcInstance pl = (L2PcInstance) killer;
+ if (inBiohazard() && !isZombie() && pl.inBiohazard() && pl.isZombie() && Biohazard.isStarted())
+ {
+ pl.abortAttack();
+ pl.abortCast();
+ doRevive();
+ Biohazard.infectPlayer(this);
+ stopAllEffects();
+ setCurrentHp(getMaxHp());
+ setCurrentMp(getMaxMp());
+ setCurrentCp(getMaxCp());
+ }
+ }
+
if (isMounted())
stopFeed();
synchronized (this)
@@ -5582,6 +5614,18 @@
{
reviveRequest(this, null, false);
}
+
+ if (isZombie() && inBiohazard())
+ {
+ if (Biohazard._infected.contains(this))
+ {
+ Biohazard._infected.remove(this);
+ untransform();
+ if (Biohazard._infected.size() == 0)
+ Biohazard.playersWin();
+ }
+ }
+
return true;
}
@@ -8529,7 +8573,17 @@
// Check if the attacker isn't the L2PcInstance Pet
if (attacker == this || attacker == getPet())
return false;
-
+
+ L2PcInstance player = null;
+ if (attacker instanceof L2PcInstance)
+ player = (L2PcInstance) attacker;
+ if (attacker instanceof L2SummonInstance)
+ player = ((L2SummonInstance) attacker).getOwner();
+
+ if (player != null)
+ if (Biohazard.isStarted() && player.inBiohazard() && inBiohazard() && player.isZombie() != isZombie())
+ return true;
+
// TODO: check for friendly mobs
// Check if the attacker is a L2MonsterInstance
if (attacker instanceof L2MonsterInstance)
@@ -8918,6 +8972,9 @@
sendPacket(ActionFailed.STATIC_PACKET);
return false;
}
+
+ if (skill.getId() == 619 && inBiohazard() && isZombie())
+ return false;
//************************************* Check Skill Type *******************************************
@@ -8929,7 +8986,24 @@
// If L2Character or target is in a peace zone, send a system message TARGET_IN_PEACEZONE a Server->Client packet ActionFailed
sendPacket(new SystemMessage(SystemMessageId.TARGET_IN_PEACEZONE));
sendPacket(ActionFailed.STATIC_PACKET);
- return false;
+
+ boolean cond = true;
+ L2PcInstance trgtF = null;
+ if (target instanceof L2PcInstance)
+ trgtF = (L2PcInstance) target;
+ else if (target instanceof L2SummonInstance)
+ trgtF = ((L2SummonInstance) target).getOwner();
+ if (trgtF != null)
+ if (Biohazard.isStarted() && trgtF.inBiohazard() && inBiohazard())
+ {
+ if (trgtF.isZombie() != isZombie())
+ cond = true;
+ if (trgtF.isZombie() == isZombie())
+ cond = false;
+ }
+
+ if (!cond)
+ return false;
}
if (isInOlympiadMode() && !isOlympiadStart()){
@@ -9357,6 +9431,8 @@
{
if(skill.isPvpSkill()) // pvp skill
{
+ if (Biohazard.isStarted() && inBiohazard() && ((L2PcInstance)target).inBiohazard() && isZombie() != ((L2PcInstance)target).isZombie())
+ return true;
if(getClan() != null && ((L2PcInstance)target).getClan() != null)
{
if(getClan().isAtWarWith(((L2PcInstance)target).getClan().getClanId()) && ((L2PcInstance)target).getClan().isAtWarWith(getClan().getClanId()))
@@ -9387,6 +9463,10 @@
return true;
}
+ private boolean inBiohazard() {
+ return _inBiohazard;
+ }
+
/**
* Return True if the L2PcInstance is a Mage.<BR><BR>
*/
@@ -11791,6 +11871,15 @@
_log.log(Level.SEVERE, "deleteMe()", e);
}
+ try
+ {
+ Biohazard.onLogout(this);
+ }
+ catch (Exception e)
+ {
+ _log.log(Level.SEVERE, "deleteMe()", e);
+ }
+
// Update database with items in its inventory and remove them from the world
try
{
@@ -13045,6 +13134,10 @@
private int _afroId = 0;
private boolean _isInSiege;
+ public int _oldX;
+ public int _oldY;
+ public int _oldZ;
+
public Collection<TimeStamp> getReuseTimeStamps()
{
return _reuseTimeStamps.values();
@@ -14542,4 +14635,9 @@
}
}
}
+
+ public void setIsInBiohazard(boolean b)
+ {
+ _inBiohazard = b;
+ }
}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/model/entity/Biohazard.java
===================================================================
--- java/com/l2jserver/gameserver/model/entity/Biohazard.java (revision 0)
+++ java/com/l2jserver/gameserver/model/entity/Biohazard.java (revision 0)
@@ -0,0 +1,318 @@
+/*
+ * 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 com.l2jserver.gameserver.model.entity;
+
+import java.util.logging.Logger;
+
+import javolution.util.FastSet;
+
+import com.l2jserver.gameserver.Announcements;
+import com.l2jserver.gameserver.instancemanager.TransformationManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.olympiad.Olympiad;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author Laikeriz
+ */
+public class Biohazard
+{
+ enum EventState
+ {
+ INACTIVE, INACTIVATING, REGISTERING, STARTED, REWARDING
+ }
+
+ private final static Logger _log = Logger.getLogger(Biohazard.class.getName());
+ private static EventState _state = EventState.INACTIVE;
+
+ public static FastSet<L2PcInstance> _participants = new FastSet<L2PcInstance>();
+ public static FastSet<L2PcInstance> _infected = new FastSet<L2PcInstance>();
+ public static FastSet<L2PcInstance> _notInfected = new FastSet<L2PcInstance>();
+
+ public static boolean isStarted()
+ {
+ if (_state == EventState.STARTED)
+ return true;
+ return false;
+ }
+
+ public static boolean isRegistering()
+ {
+ if (_state == EventState.REGISTERING)
+ return true;
+ return false;
+ }
+
+ public static void startRegistering()
+ {
+ if (_state == EventState.REGISTERING || _state == EventState.STARTED)
+ return;
+ Announcements.getInstance().announceToAll("Biohazard: Registration is open.");
+ Announcements.getInstance().announceToAll("Biohazard: Type \".bhreg\" to register to event.");
+ Announcements.getInstance().announceToAll("Biohazard: Type \".bhunreg\" to unregister from event.");
+ _state = EventState.REGISTERING;
+ int step = 0;
+ int after = 0;
+ for (int i = 40; i > 0; i -= 10)
+ {
+ switch (i)
+ {
+ case 40:
+ step = 5;
+ after = 15;
+ break;
+ case 30:
+ step = 5;
+ after = 10;
+ break;
+ case 20:
+ step = 4;
+ after = 5;
+ break;
+ case 10:
+ step = 1;
+ after = 1;
+ break;
+ }
+ if (_state == EventState.INACTIVE)
+ return;
+ Announcements.getInstance().announceToAll("Biohazard: Registration will be closed in " + after + " minute(s).");
+ try
+ {
+ Thread.sleep(step * 60000);
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ //sound = "";
+ try
+ {
+ Thread.sleep(60000);
+ }
+ catch (Exception e)
+ {
+ }
+ if (_state == EventState.INACTIVE)
+ return;
+ if (_participants.size() >= 2)
+ {
+ Announcements.getInstance().announceToAll("Biohazard: Teleporting players in 20 seconds.");
+ try
+ {
+ Thread.sleep(20000);
+ }
+ catch (Exception e)
+ {
+ }
+ _state = EventState.STARTED;
+ startEventAndTelePl();
+ }
+ else
+ Announcements.getInstance().announceToAll("Biohazard: Event aborted due to lack of participants.");
+ }
+
+ public static void addParticipant(L2PcInstance player)
+ {
+ if (Olympiad.getInstance().isRegistered(player) || TvTEvent.isPlayerParticipant(player.getObjectId()))
+ {
+ player.sendMessage("You cannot register because of registration in another event");
+ return;
+ }
+ if (_state == EventState.REGISTERING && !_participants.contains(player))
+ {
+ _participants.add(player);
+ player.sendMessage("You have successfully registered to this event");
+ }
+ else
+ player.sendMessage("You are already registered or it's not registration time.");
+ }
+
+ public static void removeParticipant(L2PcInstance player)
+ {
+ if (_state == EventState.REGISTERING)
+ {
+ if (_participants.contains(player))
+ _participants.remove(player);
+ else
+ player.sendMessage("You aren't registered in this event.");
+ player.setIsInBiohazard(false);
+ }
+ else
+ player.sendMessage("It's not registration time.");
+ }
+
+ public static void startEventAndTelePl()
+ {
+ if (_state == EventState.INACTIVE)
+ return;
+ synchronized (_participants)
+ {
+ for (L2PcInstance pl : _participants)
+ if (pl.isOnline() == 1)
+ {
+ _notInfected.add(pl);
+ pl._oldX = pl.getX();
+ pl._oldY = pl.getY();
+ pl._oldZ = pl.getZ();
+ pl.teleToLocation(-17507, 143206, -3911);
+ pl.setTeam(0);
+ pl.setIsInBiohazard(true);
+ pl.untransform();
+ }
+ }
+ Announcements.getInstance().announceToAll("Biohazard: Teleportion done.");
+ Announcements.getInstance().announceToAll("Biohazard: One player was infected by untreatable virus!");
+ Announcements.getInstance().announceToAll("Biohazard: In about one minute virus will take over his body and he will become zombie!");
+ try
+ {
+ Thread.sleep(60000);
+ }
+ catch (Exception e)
+ {
+ }
+ int num = Math.round(Rnd.get(_notInfected.size() - 1));
+ L2PcInstance infectFirst = ((L2PcInstance[]) getAllNotInfected())[num];
+ infectPlayer(infectFirst);
+ Announcements.getInstance().announceToAll("Biohazard: Virus took over " + infectFirst.getName() + " body and he wants to infect everybody else!");
+ }
+
+ public static void infectPlayer(L2PcInstance zombie)
+ {
+ if (_state == EventState.INACTIVE)
+ return;
+ if (zombie.isTransformed())
+ zombie.untransform();
+ zombie.setIsZombie(true);
+ _notInfected.remove(zombie);
+ _infected.add(zombie);
+ TransformationManager.getInstance().transformPlayer(303, zombie);
+ if (_notInfected.size() == 0)
+ zombiesWin();
+ }
+
+ public static void onLogout(L2PcInstance playerInstance)
+ {
+ if (_state == EventState.REGISTERING)
+ removeParticipant(playerInstance);
+ else if (_state == EventState.STARTED)
+ {
+ playerInstance.setXYZ(playerInstance._oldX, playerInstance._oldY, playerInstance._oldZ);
+ if (!playerInstance.isZombie())
+ _notInfected.remove(playerInstance);
+ else if (playerInstance.isZombie())
+ _infected.remove(playerInstance);
+ if (_notInfected.size() == 0)
+ zombiesWin();
+ if (_infected.size() == 0)
+ playersWin();
+ }
+ }
+
+ public static void zombiesWin()
+ {
+ if (_state == EventState.INACTIVE)
+ return;
+ Announcements.getInstance().announceToAll("Biohazard: Zombies won.");
+ Announcements.getInstance().announceToAll("Biohazard: Rewarding and teleporting participants back to village in 20 seconds.");
+ _state = EventState.REWARDING;
+ try
+ {
+ Thread.sleep(20000);
+ }
+ catch (Exception e)
+ {
+ }
+ synchronized (_infected)
+ {
+ for (L2PcInstance pl : _infected)
+ if (pl.isOnline() == 1)
+ pl.addItem("Biohazard", 6673, 1, pl, true);
+ }
+ synchronized (_participants)
+ {
+ for (L2PcInstance pl : _participants)
+ if (pl.isOnline() == 1)
+ {
+ pl.teleToLocation(pl._oldX, pl._oldY, pl._oldZ);
+ pl.setIsInBiohazard(false);
+ // if (pl.inWorld() == 1)
+ // pl.setTeam(pl.getFactionId());
+ if (pl.isTransformed())
+ pl.untransform();
+ }
+ }
+ _participants.clear();
+ _infected.clear();
+ _notInfected.clear();
+ _state = EventState.INACTIVE;
+ }
+
+ public static void playersWin()
+ {
+ Announcements.getInstance().announceToAll("Biohazard: Players won.");
+ Announcements.getInstance().announceToAll("Biohazard: Rewarding and teleporting participants back to village in 20 seconds.");
+ _state = EventState.REWARDING;
+ try
+ {
+ Thread.sleep(20000);
+ }
+ catch (Exception e)
+ {
+ }
+ synchronized (_notInfected)
+ {
+ for (L2PcInstance pl : _notInfected)
+ if (pl.isOnline() == 1)
+ {
+ pl.addItem("Biohazard", 6673, 1, pl, true);
+ }
+ }
+ synchronized (_participants)
+ {
+ for (L2PcInstance pl : _participants)
+ if (pl.isOnline() == 1)
+ {
+ pl.teleToLocation(pl._oldX, pl._oldY, pl._oldZ);
+ pl.setIsInBiohazard(false);
+ // if (pl.inWorld() == 1)
+ // pl.setTeam(pl.getFactionId());
+ if (pl.isTransformed())
+ pl.untransform();
+ }
+ }
+ _participants.clear();
+ _infected.clear();
+ _notInfected.clear();
+ _state = EventState.INACTIVE;
+ }
+
+ public static L2PcInstance[] getAllNotInfected()
+ {
+ synchronized (_notInfected)
+ {
+ return _notInfected.toArray(new L2PcInstance[_notInfected.size()]);
+ }
+ }
+
+ public static void abortEvent()
+ {
+ _state = EventState.INACTIVE;
+ _participants.clear();
+ _notInfected.clear();
+ _infected.clear();
+ Announcements.getInstance().announceToAll("Biohazard: Event aborted.");
+ }
+}
CitarDATA:
Index: data/scripts/handlers/MasterHandler.java
===================================================================
--- data/scripts/handlers/MasterHandler.java (revision 6783)
+++ data/scripts/handlers/MasterHandler.java (working copy)
@@ -231,6 +231,7 @@
VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new Banking());
if (Config.TVT_ALLOW_VOICED_COMMAND)
VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new TvTVoicedInfo());
+ VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new biohazard());
_log.config("Loaded " + VoicedCommandHandler.getInstance().size() + " VoicedHandlers");
}
Index: data/scripts/handlers/admincommandhandlers/AdminEventEngine.java
===================================================================
--- data/scripts/handlers/admincommandhandlers/AdminEventEngine.java (revision 6783)
+++ data/scripts/handlers/admincommandhandlers/AdminEventEngine.java (working copy)
@@ -33,6 +33,7 @@
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.Biohazard;
import com.l2jserver.gameserver.model.entity.L2Event;
import com.l2jserver.gameserver.network.serverpackets.CharInfo;
import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
@@ -75,7 +76,9 @@
"admin_event_control_unpoly",
"admin_event_control_prize",
"admin_event_control_chatban",
- "admin_event_control_finish"
+ "admin_event_control_finish",
+ "admin_bh_start",
+ "admin_bh_abort"
};
private static String tempBuffer = "";
@@ -138,7 +141,6 @@
showMainPage(activeChar);
}
-
else if (command.startsWith("admin_event_name"))
{
tempName += command.substring(17);
@@ -158,7 +160,6 @@
tempBuffer = "";
}
}
-
else if (command.startsWith("admin_event_store"))
{
@@ -383,6 +384,14 @@
adminReply.setHtml(replyMSG);
activeChar.sendPacket(adminReply);
}
+ else if (command.equals("admin_bh_start"))
+ {
+ Biohazard.startRegistering();
+ }
+ else if (command.equals("admin_bh_abort"))
+ {
+ Biohazard.abortEvent();
+ }
return true;
}
Index: data/scripts/handlers/voicedcommandhandlers/biohazard.java
===================================================================
--- data/scripts/handlers/voicedcommandhandlers/biohazard.java (revision 0)
+++ data/scripts/handlers/voicedcommandhandlers/biohazard.java (revision 0)
@@ -0,0 +1,50 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package handlers.voicedcommandhandlers;
+
+import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.entity.Biohazard;
+
+/**
+*
+*
+*/
+public class biohazard implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS = { "bhreg", "bhunreg" };
+
+ /**
+ *
+ * @see com.l2jserver.gameserver.handler.IVoicedCommandHandler#useVoicedCommand(java.lang.String, com.l2jserver.gameserver.model.actor.instance.L2PcInstance, java.lang.String)
+ */
+ public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params)
+ {
+ if (command.equalsIgnoreCase("bhreg"))
+ Biohazard.addParticipant(activeChar);
+ else if (command.equalsIgnoreCase("bhunreg"))
+ Biohazard.removeParticipant(activeChar);
+ return true;
+ }
+
+ /**
+ *
+ * @see com.l2jserver.gameserver.handler.IVoicedCommandHandler#getVoicedCommandList()
+ */
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
Index: sql/admin_command_access_rights.sql
===================================================================
--- sql/admin_command_access_rights.sql (revision 6838)
+++ sql/admin_command_access_rights.sql (working copy)
@@ -537,4 +537,8 @@
-- ZONE
('admin_zone_check','1'),
-('admin_zone_reload','1');
\ No newline at end of file
+('admin_zone_reload','1'),
+
+-- Biohazard event
+('admin_bh_abort', '1'),
+('admin_bh_start', '1');
\ No newline at end of file