Effect list rework.
Contributed by Liamxroy.
This commit is contained in:
@@ -49,6 +49,7 @@
|
||||
<admin command="admin_getbuffs" accessLevel="100" />
|
||||
<admin command="admin_stopbuff" accessLevel="100" />
|
||||
<admin command="admin_stopallbuffs" accessLevel="100" confirmDlg="true" />
|
||||
<admin command="admin_viewblockedeffects" accessLevel="100" />
|
||||
<admin command="admin_areacancel" accessLevel="100" />
|
||||
<admin command="admin_removereuse" accessLevel="100" />
|
||||
<admin command="admin_switch_gm_buffs" accessLevel="100" />
|
||||
@@ -180,6 +181,7 @@
|
||||
<admin command="admin_social" accessLevel="100" />
|
||||
<admin command="admin_social_menu" accessLevel="100" />
|
||||
<admin command="admin_effect" accessLevel="100" />
|
||||
<admin command="admin_npc_use_skill" accessLevel="100" />
|
||||
<admin command="admin_effect_menu" accessLevel="100" />
|
||||
<admin command="admin_ave_abnormal" accessLevel="100" />
|
||||
<admin command="admin_play_sounds" accessLevel="100" />
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Effects of %targetName%</title>
|
||||
</head>
|
||||
<body>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td width=45>
|
||||
<button value="Main" action="bypass -h admin_admin" width=45 height=21 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
|
||||
</td>
|
||||
<td width=180>
|
||||
<center><font color="LEVEL">Effects of %targetName%</font></center>
|
||||
</td>
|
||||
<td width=45>
|
||||
<button value="Back" action="bypass -h admin_current_player" width=45 height=21 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<td width=200>Skill</td>
|
||||
<td width=30>Rem. Time</td>
|
||||
<td width=70>Action</td>
|
||||
</tr>
|
||||
%buffs%
|
||||
</table>
|
||||
<br>%pages%<br>
|
||||
<button value="View Blocked Effects" action="bypass -h admin_viewblockedeffects %targetObjId%" width=160 height=21 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"><br>
|
||||
<button value="Remove All" action="bypass -h admin_stopallbuffs %targetObjId%" width=80 height=21 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df">
|
||||
<br>
|
||||
Total buff count: %effectSize%
|
||||
</body>
|
||||
</html>
|
||||
+1
-1
@@ -371,7 +371,7 @@ public final class Race extends Event
|
||||
player.standUp();
|
||||
}
|
||||
|
||||
player.getEffectList().stopSkillEffects(true, AbnormalType.SPEED_UP);
|
||||
player.getEffectList().stopEffects(AbnormalType.SPEED_UP);
|
||||
player.stopSkillEffects(true, 268);
|
||||
player.stopSkillEffects(true, 298); // Rabbit Spirit Totem
|
||||
SkillData.getInstance().getSkill(_skill, 1).applyEffects(player, player);
|
||||
|
||||
Vendored
+105
-109
@@ -19,6 +19,7 @@ package handlers.admincommandhandlers;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
@@ -29,6 +30,9 @@ import com.l2jmobius.gameserver.model.L2World;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
import com.l2jmobius.gameserver.model.html.PageBuilder;
|
||||
import com.l2jmobius.gameserver.model.html.PageResult;
|
||||
import com.l2jmobius.gameserver.model.html.styles.ButtonsStyle;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
@@ -39,8 +43,6 @@ import com.l2jmobius.gameserver.util.GMAudit;
|
||||
|
||||
public class AdminBuffs implements IAdminCommandHandler
|
||||
{
|
||||
private static final int PAGE_LIMIT = 20;
|
||||
|
||||
private static final String[] ADMIN_COMMANDS =
|
||||
{
|
||||
"admin_buff",
|
||||
@@ -48,6 +50,7 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
"admin_getbuffs_ps",
|
||||
"admin_stopbuff",
|
||||
"admin_stopallbuffs",
|
||||
"admin_viewblockedeffects",
|
||||
"admin_areacancel",
|
||||
"admin_removereuse",
|
||||
"admin_switch_gm_buffs"
|
||||
@@ -109,7 +112,7 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
final L2PcInstance player = L2World.getInstance().getPlayer(playername);
|
||||
if (player != null)
|
||||
{
|
||||
int page = 1;
|
||||
int page = 0;
|
||||
if (st.hasMoreTokens())
|
||||
{
|
||||
page = Integer.parseInt(st.nextToken());
|
||||
@@ -122,7 +125,7 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
}
|
||||
else if ((activeChar.getTarget() != null) && activeChar.getTarget().isCharacter())
|
||||
{
|
||||
showBuffs(activeChar, (L2Character) activeChar.getTarget(), 1, command.endsWith("_ps"));
|
||||
showBuffs(activeChar, (L2Character) activeChar.getTarget(), 0, command.endsWith("_ps"));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@@ -168,6 +171,23 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_viewblockedeffects"))
|
||||
{
|
||||
try
|
||||
{
|
||||
StringTokenizer st = new StringTokenizer(command, " ");
|
||||
st.nextToken();
|
||||
int objectId = Integer.parseInt(st.nextToken());
|
||||
viewBlockedEffects(activeChar, objectId);
|
||||
return true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activeChar.sendMessage("Failed viewing blocked effects: " + e.getMessage());
|
||||
activeChar.sendMessage("Usage: //viewblockedeffects <objectId>");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_areacancel"))
|
||||
{
|
||||
final StringTokenizer st = new StringTokenizer(command, " ");
|
||||
@@ -283,115 +303,48 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
effects.addAll(target.getEffectList().getPassives());
|
||||
}
|
||||
|
||||
if ((page > ((effects.size() / PAGE_LIMIT) + 1)) || (page < 1))
|
||||
{
|
||||
return;
|
||||
}
|
||||
final String pageLink = "bypass -h admin_getbuffs" + (passive ? "_ps " : " ") + target.getName();
|
||||
|
||||
int max = effects.size() / PAGE_LIMIT;
|
||||
if (effects.size() > (PAGE_LIMIT * max))
|
||||
final PageResult result = PageBuilder.newBuilder(effects, 3, pageLink).currentPage(page).style(ButtonsStyle.INSTANCE).bodyHandler((pages, info, sb) ->
|
||||
{
|
||||
max++;
|
||||
}
|
||||
|
||||
final StringBuilder html = new StringBuilder(500 + (effects.size() * 200));
|
||||
html.append("<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td width=180><center><font color=\"LEVEL\">Effects of ");
|
||||
html.append(target.getName());
|
||||
html.append("</font></td><td width=45><button value=\"Back\" action=\"bypass -h admin_current_player\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table><br><table width=\"100%\"><tr><td width=200>Skill</td><td width=30>Rem. Time</td><td width=70>Action</td></tr>");
|
||||
|
||||
final int start = ((page - 1) * PAGE_LIMIT);
|
||||
final int end = Math.min(((page - 1) * PAGE_LIMIT) + PAGE_LIMIT, effects.size());
|
||||
int count = 0;
|
||||
for (BuffInfo info : effects)
|
||||
{
|
||||
if ((count >= start) && (count < end))
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
{
|
||||
final Skill skill = info.getSkill();
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
{
|
||||
html.append("<tr><td>");
|
||||
html.append(!info.isInUse() ? FONT_RED1 : "");
|
||||
html.append(skill.getName());
|
||||
html.append(" Lv ");
|
||||
html.append(skill.getLevel());
|
||||
html.append(" (");
|
||||
html.append(effect.getClass().getSimpleName());
|
||||
html.append(")");
|
||||
html.append(!info.isInUse() ? FONT_RED2 : "");
|
||||
html.append("</td><td>");
|
||||
html.append(skill.isToggle() ? "T (" + info.getTickCount(effect) + ")" : skill.isPassive() ? "P" : info.getTime() + "s");
|
||||
html.append("</td><td><button value=\"X\" action=\"bypass -h admin_stopbuff ");
|
||||
html.append(target.getObjectId());
|
||||
html.append(" ");
|
||||
html.append(skill.getId());
|
||||
html.append("\" width=30 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
}
|
||||
sb.append("<tr><td>");
|
||||
sb.append(!info.isInUse() ? FONT_RED1 : "");
|
||||
sb.append(info.getSkill().getName());
|
||||
sb.append(" Lv ");
|
||||
sb.append(info.getSkill().getLevel());
|
||||
sb.append(" (");
|
||||
sb.append(effect.getClass().getSimpleName());
|
||||
sb.append(")");
|
||||
sb.append(!info.isInUse() ? FONT_RED2 : "");
|
||||
sb.append("</td><td>");
|
||||
sb.append(info.getSkill().isToggle() ? "T (" + info.getTickCount(effect) + ")" : info.getSkill().isPassive() ? "P" : info.getTime() + "s");
|
||||
sb.append("</td><td><button value=\"X\" action=\"bypass -h admin_stopbuff ");
|
||||
sb.append(target.getObjectId());
|
||||
sb.append(" ");
|
||||
sb.append(info.getSkill().getId());
|
||||
sb.append("\" width=30 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
}
|
||||
count++;
|
||||
}).build();
|
||||
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(0, 1);
|
||||
html.setFile(activeChar.getHtmlPrefix(), "data/html/admin/getbuffs.htm");
|
||||
|
||||
if (result.getPages() > 0)
|
||||
{
|
||||
html.replace("%pages%", "<table width=280 cellspacing=0><tr>" + result.getPagerTemplate() + "</tr></table>");
|
||||
}
|
||||
else
|
||||
{
|
||||
html.replace("%pages%", "");
|
||||
}
|
||||
|
||||
html.append("</table><table width=300 bgcolor=444444><tr>");
|
||||
for (int x = 0; x < max; x++)
|
||||
{
|
||||
final int pagenr = x + 1;
|
||||
if (page == pagenr)
|
||||
{
|
||||
html.append("<td>Page ");
|
||||
html.append(pagenr);
|
||||
html.append("</td>");
|
||||
}
|
||||
else
|
||||
{
|
||||
html.append("<td><a action=\"bypass -h admin_getbuffs" + (passive ? "_ps " : " "));
|
||||
html.append(target.getName());
|
||||
html.append(" ");
|
||||
html.append(x + 1);
|
||||
html.append("\"> Page ");
|
||||
html.append(pagenr);
|
||||
html.append(" </a></td>");
|
||||
}
|
||||
}
|
||||
|
||||
html.append("</tr></table>");
|
||||
|
||||
// Buttons
|
||||
html.append("<br><center><button value=\"Refresh\" action=\"bypass -h admin_getbuffs");
|
||||
html.append(passive ? "_ps " : " ");
|
||||
html.append(target.getName());
|
||||
html.append("\" width=80 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">");
|
||||
html.append("<button value=\"Remove All\" action=\"bypass -h admin_stopallbuffs ");
|
||||
html.append(target.getObjectId());
|
||||
html.append("\" width=80 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>");
|
||||
// Legend
|
||||
if (!passive)
|
||||
{
|
||||
html.append(FONT_RED1);
|
||||
html.append("Inactive buffs: ");
|
||||
html.append(target.getEffectList().getHiddenBuffsCount());
|
||||
html.append(FONT_RED2);
|
||||
html.append("<br>");
|
||||
}
|
||||
html.append("Total");
|
||||
html.append(passive ? " passive" : "");
|
||||
html.append(" buff count: ");
|
||||
html.append(effects.size());
|
||||
if ((target.getEffectList().getBlockedAbnormalTypes() != null) && !target.getEffectList().getBlockedAbnormalTypes().isEmpty())
|
||||
{
|
||||
html.append("<br>Blocked buff slots: ");
|
||||
String slots = "";
|
||||
for (AbnormalType slot : target.getEffectList().getBlockedAbnormalTypes())
|
||||
{
|
||||
slots += slot + ", ";
|
||||
}
|
||||
|
||||
if (!slots.isEmpty() && (slots.length() > 3))
|
||||
{
|
||||
html.append(slots.substring(0, slots.length() - 2));
|
||||
}
|
||||
}
|
||||
html.append("</html>");
|
||||
// Send the packet
|
||||
activeChar.sendPacket(new NpcHtmlMessage(0, 1, html.toString()));
|
||||
html.replace("%targetName%", target.getName());
|
||||
html.replace("%targetObjId%", target.getObjectId());
|
||||
html.replace("%buffs%", result.getBodyTemplate().toString());
|
||||
html.replace("%effectSize%", effects.size());
|
||||
activeChar.sendPacket(html);
|
||||
|
||||
if (Config.GMAUDIT)
|
||||
{
|
||||
@@ -418,7 +371,7 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
activeChar.sendMessage("Removed skill ID: " + skillId + " effects from " + target.getName() + " (" + objId + ").");
|
||||
}
|
||||
|
||||
showBuffs(activeChar, target, 1, false);
|
||||
showBuffs(activeChar, target, 0, false);
|
||||
if (Config.GMAUDIT)
|
||||
{
|
||||
GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "stopbuff", target.getName() + " (" + objId + ")", Integer.toString(skillId));
|
||||
@@ -441,11 +394,54 @@ public class AdminBuffs implements IAdminCommandHandler
|
||||
{
|
||||
target.stopAllEffects();
|
||||
activeChar.sendMessage("Removed all effects from " + target.getName() + " (" + objId + ")");
|
||||
showBuffs(activeChar, target, 1, false);
|
||||
showBuffs(activeChar, target, 0, false);
|
||||
if (Config.GMAUDIT)
|
||||
{
|
||||
GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "stopallbuffs", target.getName() + " (" + objId + ")", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void viewBlockedEffects(L2PcInstance activeChar, int objId)
|
||||
{
|
||||
L2Character target = null;
|
||||
try
|
||||
{
|
||||
target = (L2Character) L2World.getInstance().findObject(objId);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activeChar.sendMessage("Target with object id " + objId + " not found.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (target != null)
|
||||
{
|
||||
final Set<AbnormalType> blockedAbnormals = target.getEffectList().getBlockedAbnormalTypes();
|
||||
final int blockedAbnormalsSize = blockedAbnormals != null ? blockedAbnormals.size() : 0;
|
||||
final StringBuilder html = new StringBuilder(500 + (blockedAbnormalsSize * 50));
|
||||
html.append("<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td width=180><center><font color=\"LEVEL\">Blocked effects of ");
|
||||
html.append(target.getName());
|
||||
html.append("</font></td><td width=45><button value=\"Back\" action=\"bypass -h admin_getbuffs" + (target.isPlayer() ? (" " + target.getName()) : "") + "\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table><br>");
|
||||
|
||||
if ((blockedAbnormals != null) && !blockedAbnormals.isEmpty())
|
||||
{
|
||||
html.append("<br>Blocked buff slots: ");
|
||||
for (AbnormalType slot : blockedAbnormals)
|
||||
{
|
||||
html.append("<br>").append(slot.toString());
|
||||
}
|
||||
}
|
||||
|
||||
html.append("</html>");
|
||||
|
||||
// Send the packet
|
||||
activeChar.sendPacket(new NpcHtmlMessage(0, 1, html.toString()));
|
||||
|
||||
if (Config.GMAUDIT)
|
||||
{
|
||||
GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "viewblockedeffects", target.getName() + " (" + Integer.toString(target.getObjectId()) + ")", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+18
-16
@@ -39,6 +39,7 @@ import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.Earthquake;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.ExRedSky;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
@@ -100,6 +101,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
"admin_setteam",
|
||||
"admin_social",
|
||||
"admin_effect",
|
||||
"admin_npc_use_skill",
|
||||
"admin_effect_menu",
|
||||
"admin_ave_abnormal",
|
||||
"admin_social_menu",
|
||||
@@ -126,16 +128,16 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
{
|
||||
activeChar.setInvisible(true);
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.sendPacket(new ExUserInfoAbnormalVisualEffect(activeChar));
|
||||
activeChar.decayMe();
|
||||
activeChar.spawnMe();
|
||||
activeChar.startAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
activeChar.sendMessage("You are now invisible.");
|
||||
}
|
||||
else
|
||||
{
|
||||
activeChar.setInvisible(false);
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.stopAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
activeChar.sendPacket(new ExUserInfoAbnormalVisualEffect(activeChar));
|
||||
activeChar.sendMessage("You are now visible.");
|
||||
}
|
||||
|
||||
@@ -146,16 +148,16 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
{
|
||||
activeChar.setInvisible(true);
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.sendPacket(new ExUserInfoAbnormalVisualEffect(activeChar));
|
||||
activeChar.decayMe();
|
||||
activeChar.spawnMe();
|
||||
activeChar.startAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
activeChar.sendMessage("You are now invisible.");
|
||||
}
|
||||
else if (command.startsWith("admin_vis"))
|
||||
{
|
||||
activeChar.setInvisible(false);
|
||||
activeChar.broadcastUserInfo();
|
||||
activeChar.stopAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
activeChar.sendPacket(new ExUserInfoAbnormalVisualEffect(activeChar));
|
||||
activeChar.sendMessage("You are now visible.");
|
||||
}
|
||||
else if (command.startsWith("admin_setinvis"))
|
||||
@@ -236,7 +238,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
{
|
||||
if (!player.isGM())
|
||||
{
|
||||
player.startAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.setBlockActions(true);
|
||||
player.startParalyze();
|
||||
player.broadcastInfo();
|
||||
@@ -247,7 +249,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
{
|
||||
L2World.getInstance().forEachVisibleObject(activeChar, L2PcInstance.class, player ->
|
||||
{
|
||||
player.stopAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.setBlockActions(false);
|
||||
player.broadcastInfo();
|
||||
|
||||
@@ -272,11 +274,11 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
player = (L2Character) target;
|
||||
if (type.equals("1"))
|
||||
{
|
||||
player.startAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.startAbnormalVisualEffect(AbnormalVisualEffect.FLESH_STONE);
|
||||
player.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.FLESH_STONE);
|
||||
}
|
||||
player.setBlockActions(true);
|
||||
player.startParalyze();
|
||||
@@ -306,11 +308,11 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
player = (L2Character) target;
|
||||
if (type.equals("1"))
|
||||
{
|
||||
player.stopAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
player.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.PARALYZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.stopAbnormalVisualEffect(AbnormalVisualEffect.FLESH_STONE);
|
||||
player.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.FLESH_STONE);
|
||||
}
|
||||
player.setBlockActions(false);
|
||||
player.broadcastInfo();
|
||||
@@ -329,7 +331,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
if (target instanceof L2Character)
|
||||
{
|
||||
player = (L2Character) target;
|
||||
player.startAbnormalVisualEffect(AbnormalVisualEffect.BIG_HEAD);
|
||||
player.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.BIG_HEAD);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -345,7 +347,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
if (target instanceof L2Character)
|
||||
{
|
||||
player = (L2Character) target;
|
||||
player.stopAbnormalVisualEffect(AbnormalVisualEffect.BIG_HEAD);
|
||||
player.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.BIG_HEAD);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -604,7 +606,7 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (command.startsWith("admin_effect"))
|
||||
else if (command.startsWith("admin_effect") || command.startsWith("admin_npc_use_skill"))
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -707,13 +709,13 @@ public class AdminEffects implements IAdminCommandHandler
|
||||
if (target instanceof L2Character)
|
||||
{
|
||||
final L2Character character = (L2Character) target;
|
||||
if (!character.hasAbnormalVisualEffect(ave))
|
||||
if (!character.getEffectList().hasAbnormalVisualEffect(ave))
|
||||
{
|
||||
character.startAbnormalVisualEffect(ave);
|
||||
character.getEffectList().startAbnormalVisualEffect(ave);
|
||||
}
|
||||
else
|
||||
{
|
||||
character.stopAbnormalVisualEffect(ave);
|
||||
character.getEffectList().stopAbnormalVisualEffect(ave);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -70,7 +70,7 @@ public final class Detection extends AbstractEffect
|
||||
}
|
||||
|
||||
// Remove Hide.
|
||||
target.getEffectList().stopSkillEffects(true, AbnormalType.HIDE);
|
||||
target.getEffectList().stopEffects(AbnormalType.HIDE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+19
-27
@@ -17,18 +17,15 @@
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.l2jmobius.gameserver.model.CharEffectList;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
|
||||
/**
|
||||
@@ -42,10 +39,10 @@ public final class DispelBySlot extends AbstractEffect
|
||||
|
||||
public DispelBySlot(StatsSet params)
|
||||
{
|
||||
_dispel = params.getString("dispel", null);
|
||||
_dispel = params.getString("dispel");
|
||||
if ((_dispel != null) && !_dispel.isEmpty())
|
||||
{
|
||||
_dispelAbnormals = new EnumMap<>(AbnormalType.class);
|
||||
_dispelAbnormals = new HashMap<>();
|
||||
for (String ngtStack : _dispel.split(";"))
|
||||
{
|
||||
final String[] ngt = ngtStack.split(",");
|
||||
@@ -78,32 +75,27 @@ public final class DispelBySlot extends AbstractEffect
|
||||
return;
|
||||
}
|
||||
|
||||
final CharEffectList effectList = effected.getEffectList();
|
||||
// There is no need to iterate over all buffs,
|
||||
// Just iterate once over all slots to dispel and get the buff with that abnormal if exists,
|
||||
// Operation of O(n) for the amount of slots to dispel (which is usually small) and O(1) to get the buff.
|
||||
for (Entry<AbnormalType, Short> entry : _dispelAbnormals.entrySet())
|
||||
// Continue only if target has any of the abnormals. Save useless cycles.
|
||||
if (effected.getEffectList().hasAbnormalType(_dispelAbnormals.keySet()))
|
||||
{
|
||||
// Dispel transformations (buff and by GM)
|
||||
if ((entry.getKey() == AbnormalType.TRANSFORM))
|
||||
final Short transformToDispel = _dispelAbnormals.get(AbnormalType.TRANSFORM);
|
||||
if ((transformToDispel != null) && ((transformToDispel == effected.getTransformationId()) || (transformToDispel < 0)))
|
||||
{
|
||||
if ((entry.getValue() == effected.getTransformationId()) || (entry.getValue() < 0))
|
||||
effected.stopTransformation(true);
|
||||
}
|
||||
|
||||
effected.getEffectList().stopEffects(info ->
|
||||
{
|
||||
// We have already dealt with transformation from above.
|
||||
if (info.isAbnormalType(AbnormalType.TRANSFORM))
|
||||
{
|
||||
effected.stopTransformation(true);
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final BuffInfo toDispel = effectList.getBuffInfoByAbnormalType(entry.getKey());
|
||||
if (toDispel == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((entry.getKey() == toDispel.getSkill().getAbnormalType()) && ((entry.getValue() < 0) || (entry.getValue() >= toDispel.getSkill().getAbnormalLvl())))
|
||||
{
|
||||
effectList.stopSkillEffects(true, entry.getKey());
|
||||
}
|
||||
|
||||
final Short abnormalLevel = _dispelAbnormals.get(info.getSkill().getAbnormalType());
|
||||
return (abnormalLevel != null) && ((abnormalLevel < 0) || (abnormalLevel >= info.getSkill().getAbnormalLvl()));
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-11
@@ -20,7 +20,6 @@ import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.l2jmobius.gameserver.model.CharEffectList;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
@@ -39,7 +38,7 @@ public final class DispelBySlotMyself extends AbstractEffect
|
||||
|
||||
public DispelBySlotMyself(StatsSet params)
|
||||
{
|
||||
final String dispel = params.getString("dispel", null);
|
||||
String dispel = params.getString("dispel");
|
||||
if ((dispel != null) && !dispel.isEmpty())
|
||||
{
|
||||
_dispelAbnormals = new HashSet<>();
|
||||
@@ -74,14 +73,7 @@ public final class DispelBySlotMyself extends AbstractEffect
|
||||
return;
|
||||
}
|
||||
|
||||
final CharEffectList effectList = effected.getEffectList();
|
||||
// There is no need to iterate over all buffs,
|
||||
// Just iterate once over all slots to dispel and get the buff with that abnormal if exists,
|
||||
// Operation of O(n) for the amount of slots to dispel (which is usually small) and O(1) to get the buff.
|
||||
for (AbnormalType entry : _dispelAbnormals)
|
||||
{
|
||||
// The effectlist should already check if it has buff with this abnormal type or not.
|
||||
effectList.stopSkillEffects(true, entry);
|
||||
}
|
||||
// The effectlist should already check if it has buff with this abnormal type or not.
|
||||
effected.getEffectList().stopEffects(info -> !info.getSkill().isIrreplacableBuff() && _dispelAbnormals.contains(info.getSkill().getAbnormalType()), true);
|
||||
}
|
||||
}
|
||||
|
||||
+21
-32
@@ -17,19 +17,16 @@
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.model.CharEffectList;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||
import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
|
||||
/**
|
||||
@@ -44,14 +41,14 @@ public final class DispelBySlotProbability extends AbstractEffect
|
||||
|
||||
public DispelBySlotProbability(StatsSet params)
|
||||
{
|
||||
_dispel = params.getString("dispel", null);
|
||||
_dispel = params.getString("dispel");
|
||||
_rate = params.getInt("rate", 100);
|
||||
if ((_dispel != null) && !_dispel.isEmpty())
|
||||
{
|
||||
_dispelAbnormals = new EnumMap<>(AbnormalType.class);
|
||||
_dispelAbnormals = new HashMap<>();
|
||||
for (String ngtStack : _dispel.split(";"))
|
||||
{
|
||||
final String[] ngt = ngtStack.split(",");
|
||||
String[] ngt = ngtStack.split(",");
|
||||
_dispelAbnormals.put(AbnormalType.getAbnormalType(ngt[0]), Short.MAX_VALUE);
|
||||
}
|
||||
}
|
||||
@@ -81,34 +78,26 @@ public final class DispelBySlotProbability extends AbstractEffect
|
||||
return;
|
||||
}
|
||||
|
||||
final CharEffectList effectList = effected.getEffectList();
|
||||
// There is no need to iterate over all buffs,
|
||||
// Just iterate once over all slots to dispel and get the buff with that abnormal if exists,
|
||||
// Operation of O(n) for the amount of slots to dispel (which is usually small) and O(1) to get the buff.
|
||||
for (Entry<AbnormalType, Short> entry : _dispelAbnormals.entrySet())
|
||||
// Dispel transformations (buff and by GM)
|
||||
if ((Rnd.get(100) < _rate))
|
||||
{
|
||||
if ((Rnd.get(100) < _rate))
|
||||
final Short transformToDispel = _dispelAbnormals.get(AbnormalType.TRANSFORM);
|
||||
if ((transformToDispel != null) && ((transformToDispel == effected.getTransformationId()) || (transformToDispel < 0)))
|
||||
{
|
||||
// Dispel transformations (buff and by GM)
|
||||
if ((entry.getKey() == AbnormalType.TRANSFORM))
|
||||
{
|
||||
if ((entry.getValue() == effected.getTransformationId()) || (entry.getValue() < 0))
|
||||
{
|
||||
effected.stopTransformation(true);
|
||||
}
|
||||
}
|
||||
|
||||
final BuffInfo toDispel = effectList.getBuffInfoByAbnormalType(entry.getKey());
|
||||
if (toDispel == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((toDispel.getSkill().getAbnormalType() == entry.getKey()) && (entry.getValue() >= toDispel.getSkill().getAbnormalLvl()))
|
||||
{
|
||||
effectList.stopSkillEffects(true, entry.getKey());
|
||||
}
|
||||
effected.stopTransformation(true);
|
||||
}
|
||||
}
|
||||
|
||||
effected.getEffectList().stopEffects(info ->
|
||||
{
|
||||
// We have already dealt with transformation from above.
|
||||
if (info.isAbnormalType(AbnormalType.TRANSFORM))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final Short abnormalLevel = (Rnd.get(100) < _rate) ? _dispelAbnormals.get(info.getSkill().getAbnormalType()) : null;
|
||||
return (abnormalLevel != null) && ((abnormalLevel < 0) || (abnormalLevel >= info.getSkill().getAbnormalLvl()));
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@ public final class MagicalAbnormalDispelAttack extends AbstractEffect
|
||||
public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item)
|
||||
{
|
||||
// First dispells the effect, then does damage. Sometimes the damage is evaded, but debuff is still dispelled.
|
||||
if (effector.isAlikeDead() || (_abnormalType == AbnormalType.NONE) || !effected.getEffectList().stopSkillEffects(true, _abnormalType))
|
||||
if (effector.isAlikeDead() || (_abnormalType == AbnormalType.NONE) || !effected.getEffectList().stopEffects(_abnormalType))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -82,7 +82,7 @@ public final class MagicalAttack extends AbstractEffect
|
||||
double damage = Formulas.calcMagicDam(effector, effected, skill, effector.getMAtk(), _power, effected.getMDef(), sps, bss, mcrit);
|
||||
|
||||
// Apply debuff mod
|
||||
if (effected.getEffectList().hasDebuffs())
|
||||
if (effected.getEffectList().getDebuffCount() > 0)
|
||||
{
|
||||
damage *= _debuffModifier;
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -76,7 +76,7 @@ public final class StealAbnormal extends AbstractEffect
|
||||
stolen.setAbnormalTime(infoToSteal.getTime()); // Copy the remaining time.
|
||||
// To include all the effects, it's required to go through the template rather the buff info.
|
||||
infoToSteal.getSkill().applyEffectScope(EffectScope.GENERAL, stolen, true, true);
|
||||
effected.getEffectList().remove(true, infoToSteal, null);
|
||||
effected.getEffectList().remove(infoToSteal, true, true);
|
||||
effector.getEffectList().add(stolen);
|
||||
}
|
||||
}
|
||||
|
||||
+2
-7
@@ -20,7 +20,6 @@ import com.l2jmobius.gameserver.model.L2Object;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.ISkillCondition;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
|
||||
@@ -45,12 +44,8 @@ public class OpCheckAbnormalSkillCondition implements ISkillCondition
|
||||
{
|
||||
if (target.isCharacter())
|
||||
{
|
||||
final BuffInfo info = ((L2Character) target).getEffectList().getBuffInfoByAbnormalType(_type);
|
||||
if (_hasAbnormal)
|
||||
{
|
||||
return (info != null) && (info.getSkill().getAbnormalLvl() >= _level);
|
||||
}
|
||||
return (info == null) || (info.getSkill().getAbnormalLvl() < _level);
|
||||
final boolean hasAbnormal = ((L2Character) target).getEffectList().hasAbnormalType(_type, info -> (info.getSkill().getAbnormalLvl() >= _level));
|
||||
return _hasAbnormal ? hasAbnormal : !hasAbnormal;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -6465,6 +6465,7 @@
|
||||
<value level="4">9</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -7132,6 +7133,7 @@
|
||||
<value level="7">9</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -475,6 +475,7 @@
|
||||
<value level="5">9</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -1719,6 +1720,7 @@
|
||||
<value level="5">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
|
||||
@@ -999,6 +999,7 @@
|
||||
<value level="52">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
|
||||
@@ -5929,6 +5929,7 @@
|
||||
<value level="10">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
|
||||
@@ -941,6 +941,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -2024,6 +2025,7 @@
|
||||
<value level="4">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -2545,6 +2547,7 @@
|
||||
<value level="4">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -3066,6 +3069,7 @@
|
||||
<value level="4">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<activateRate>50</activateRate>
|
||||
<affectLimit>5-12</affectLimit>
|
||||
|
||||
@@ -1711,6 +1711,7 @@
|
||||
<skill id="688" toLevel="1" name="Divine Rogue Bleed Attack">
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
|
||||
@@ -1590,6 +1590,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -2052,6 +2053,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -3857,6 +3859,7 @@
|
||||
<skill id="798" toLevel="1" name="Divine Warrior Crippling Attack">
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
|
||||
@@ -247,6 +247,7 @@
|
||||
<skill id="904" toLevel="6" name="Corpse Burst">
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<activateRate>80</activateRate>
|
||||
<affectLimit>6-12</affectLimit>
|
||||
@@ -589,6 +590,7 @@
|
||||
<skill id="909" toLevel="6" name="Ice Fog">
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<activateRate>80</activateRate>
|
||||
<affectLimit>6-12</affectLimit>
|
||||
@@ -679,6 +681,7 @@
|
||||
<skill id="910" toLevel="6" name="Water Jet">
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<activateRate>80</activateRate>
|
||||
<affectLimit>6-12</affectLimit>
|
||||
@@ -2950,6 +2953,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>6</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -4457,6 +4457,7 @@
|
||||
<value level="5">6</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
|
||||
@@ -2892,6 +2892,7 @@
|
||||
<value level="7">9</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -2975,6 +2976,7 @@
|
||||
<value level="7">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
|
||||
@@ -530,6 +530,7 @@
|
||||
<value level="6">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>60</activateRate>
|
||||
@@ -3944,6 +3945,7 @@
|
||||
<value level="19">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
|
||||
+12
-12
@@ -4221,7 +4221,7 @@
|
||||
<slot>SONG_OF_WARDING</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_WARDING</slot>
|
||||
<dispel>SONG_OF_WARDING</dispel>
|
||||
</effect>
|
||||
<effect name="MAtk">
|
||||
<amount>20</amount>
|
||||
@@ -4259,7 +4259,7 @@
|
||||
<slot>SONG_OF_WARDING</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_WARDING</slot>
|
||||
<dispel>SONG_OF_WARDING</dispel>
|
||||
</effect>
|
||||
<effect name="MAtk">
|
||||
<amount>20</amount>
|
||||
@@ -4305,7 +4305,7 @@
|
||||
<slot>SONG_OF_EARTH</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_EARTH</slot>
|
||||
<dispel>SONG_OF_EARTH</dispel>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>12</amount>
|
||||
@@ -4343,7 +4343,7 @@
|
||||
<slot>SONG_OF_EARTH</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_EARTH</slot>
|
||||
<dispel>SONG_OF_EARTH</dispel>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>12</amount>
|
||||
@@ -4389,7 +4389,7 @@
|
||||
<slot>SONG_OF_VITALITY</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_VITALITY</slot>
|
||||
<dispel>SONG_OF_VITALITY</dispel>
|
||||
</effect>
|
||||
<effect name="MaxHp">
|
||||
<amount>30</amount>
|
||||
@@ -4427,7 +4427,7 @@
|
||||
<slot>SONG_OF_VITALITY</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_VITALITY</slot>
|
||||
<dispel>SONG_OF_VITALITY</dispel>
|
||||
</effect>
|
||||
<effect name="MaxHp">
|
||||
<amount>30</amount>
|
||||
@@ -4473,7 +4473,7 @@
|
||||
<slot>SONG_OF_VENGEANCE</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_VENGEANCE</slot>
|
||||
<dispel>SONG_OF_VENGEANCE</dispel>
|
||||
</effect>
|
||||
<effect name="VampiricAttack">
|
||||
<amount>8</amount>
|
||||
@@ -4510,7 +4510,7 @@
|
||||
<slot>SONG_OF_VENGEANCE</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_VENGEANCE</slot>
|
||||
<dispel>SONG_OF_VENGEANCE</dispel>
|
||||
</effect>
|
||||
<effect name="VampiricAttack">
|
||||
<amount>8</amount>
|
||||
@@ -4555,7 +4555,7 @@
|
||||
<slot>SONG_OF_RENEWAL</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_RENEWAL</slot>
|
||||
<dispel>SONG_OF_RENEWAL</dispel>
|
||||
</effect>
|
||||
<effect name="MagicCriticalRate">
|
||||
<amount>100</amount>
|
||||
@@ -4614,7 +4614,7 @@
|
||||
<slot>SONG_OF_RENEWAL</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_RENEWAL</slot>
|
||||
<dispel>SONG_OF_RENEWAL</dispel>
|
||||
</effect>
|
||||
<effect name="MagicCriticalRate">
|
||||
<amount>100</amount>
|
||||
@@ -4693,7 +4693,7 @@
|
||||
<slot>SONG_OF_MEDITATION</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_MEDITATION</slot>
|
||||
<dispel>SONG_OF_MEDITATION</dispel>
|
||||
</effect>
|
||||
<effect name="MagicalAttackSpeed">
|
||||
<amount>30</amount>
|
||||
@@ -4740,7 +4740,7 @@
|
||||
<slot>SONG_OF_MEDITATION</slot>
|
||||
</effect>
|
||||
<effect name="DispelBySlotProbability">
|
||||
<slot>SONG_OF_MEDITATION</slot>
|
||||
<dispel>SONG_OF_MEDITATION</dispel>
|
||||
</effect>
|
||||
<effect name="MagicalAttackSpeed">
|
||||
<amount>30</amount>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<skill id="3005" toLevel="1" name="Bleed">
|
||||
<abnormalLvl>5</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -432,6 +433,7 @@
|
||||
<value level="6">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>
|
||||
@@ -479,6 +481,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>5</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>
|
||||
@@ -610,6 +613,7 @@
|
||||
<value level="6">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>
|
||||
@@ -1185,6 +1189,7 @@
|
||||
<value level="6">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>
|
||||
@@ -1250,6 +1255,7 @@
|
||||
<value level="6">7</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>
|
||||
@@ -1900,6 +1906,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>42</activateRate>
|
||||
@@ -1929,6 +1936,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -1962,6 +1970,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>12</activateRate>
|
||||
@@ -1995,6 +2004,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>24</activateRate>
|
||||
@@ -2119,6 +2129,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>10</activateRate>
|
||||
@@ -2156,6 +2167,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>18</activateRate>
|
||||
@@ -3067,6 +3079,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -3160,6 +3173,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
|
||||
@@ -202,6 +202,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -296,6 +297,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -974,6 +976,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -1067,6 +1070,7 @@
|
||||
<value level="20">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -6753,6 +6757,7 @@
|
||||
<value level="15">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -6883,6 +6888,7 @@
|
||||
<value level="15">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
|
||||
@@ -929,6 +929,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1014,6 +1015,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -1836,6 +1838,7 @@
|
||||
<value level="15">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -3271,6 +3274,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -2014,6 +2014,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>10</activateRate>
|
||||
@@ -2081,6 +2082,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>10</activateRate>
|
||||
@@ -4027,6 +4029,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
@@ -4476,6 +4479,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
@@ -5139,6 +5143,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
|
||||
@@ -306,6 +306,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
@@ -1788,6 +1789,7 @@
|
||||
<!-- Freya retail confirmed -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>3600</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<castRange>2000</castRange>
|
||||
@@ -2611,6 +2613,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
|
||||
@@ -419,6 +419,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<castRange>1500</castRange>
|
||||
@@ -2496,6 +2497,7 @@
|
||||
<!-- Freya retail confirmed -->
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>120</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<castRange>600</castRange>
|
||||
<effectPoint>100</effectPoint>
|
||||
|
||||
@@ -2483,6 +2483,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -2715,6 +2716,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -3878,6 +3880,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -3961,6 +3964,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -4044,6 +4048,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -549,6 +549,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
@@ -1054,6 +1055,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -2931,6 +2933,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>35</activateRate>
|
||||
|
||||
@@ -2705,6 +2705,7 @@
|
||||
<value level="15">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
@@ -2787,6 +2788,7 @@
|
||||
<value level="15">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>40</activateRate>
|
||||
|
||||
@@ -1558,6 +1558,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1700,6 +1701,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -2654,6 +2656,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -130,6 +130,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -214,6 +215,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -352,6 +354,7 @@
|
||||
<!-- Condition causing target to instantly decrease HP by poison. Effect 8-10. -->
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>60</activateRate>
|
||||
@@ -560,6 +563,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -643,6 +647,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1795,6 +1800,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -2930,6 +2936,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -3014,6 +3021,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -3129,6 +3137,7 @@
|
||||
<!-- Condition causing target to instantly decrease HP by poison. Effect 8-10. -->
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>60</activateRate>
|
||||
@@ -3288,6 +3297,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -3371,6 +3381,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -4384,6 +4395,7 @@
|
||||
<value level="9">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -332,6 +332,7 @@
|
||||
<!-- Condition causing target to be poisoned. -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -392,6 +393,7 @@
|
||||
<!-- Condition causing target to instantly decrease HP by bleeding. Effect 2-10. -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -991,6 +993,7 @@
|
||||
<skill id="5444" toLevel="2" name="Maul">
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>50</activateRate>
|
||||
@@ -1217,6 +1220,7 @@
|
||||
<value level="7">8</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<activateRate>80</activateRate>
|
||||
<isTriggeredSkill>true</isTriggeredSkill>
|
||||
@@ -1958,6 +1962,7 @@
|
||||
<!-- Beleth Skills -->
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<!-- Darion Skills -->
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
@@ -860,6 +861,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -2877,6 +2879,7 @@
|
||||
<skill id="5594" toLevel="1" name="Poison">
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>11</activateRate>
|
||||
@@ -2897,6 +2900,7 @@
|
||||
<skill id="5595" toLevel="1" name="Bleed">
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>11</activateRate>
|
||||
|
||||
@@ -2961,6 +2961,7 @@
|
||||
<!-- Masterwork Dagger of Poison (3861) -->
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
|
||||
@@ -151,6 +151,7 @@
|
||||
<skill id="5706" toLevel="1" name="Poison">
|
||||
<abnormalLvl>7</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -2912,6 +2913,7 @@
|
||||
<skill id="5795" toLevel="1" name="Poison">
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>30</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -3000,6 +3002,7 @@
|
||||
<skill id="5799" toLevel="1" name="Bleed">
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>90</activateRate>
|
||||
|
||||
@@ -1087,6 +1087,7 @@
|
||||
<value level="12">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -1467,6 +1468,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1514,6 +1516,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1565,6 +1568,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1615,6 +1619,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1663,6 +1668,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1709,6 +1715,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1758,6 +1765,7 @@
|
||||
<value level="10">10</value>
|
||||
</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1950,6 +1958,7 @@
|
||||
<skill id="5879" toLevel="1" name="Cruel Expunge">
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -2059,6 +2068,7 @@
|
||||
<skill id="5883" toLevel="1" name="Meggling Injury">
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>60</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -1331,6 +1331,7 @@
|
||||
<skill id="5960" toLevel="1" name="Stronghold Reactivate">
|
||||
<abnormalLvl>2</abnormalLvl>
|
||||
<abnormalTime>5</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>10</activateRate>
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<abnormalLvl>6</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1178,6 +1179,7 @@
|
||||
<skill id="6269" toLevel="1" name="Trojan Poison">
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
<!-- Monastery of Silence Skills -->
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -919,6 +920,7 @@
|
||||
<!-- Sel Mahum Training Grounds Skills -->
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>3</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>1</activateRate>
|
||||
@@ -1083,6 +1085,7 @@
|
||||
<!-- Sel Mahum Training Grounds Skills -->
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>3</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>1</activateRate>
|
||||
@@ -1609,6 +1612,7 @@
|
||||
<!-- Profuse bleeding causes you to loss 93 HP per second for 15 seconds. -->
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -1700,6 +1704,7 @@
|
||||
<skill id="6382" toLevel="1" name="Bistakon Rolling Claw">
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -1786,6 +1791,7 @@
|
||||
<skill id="6385" toLevel="1" name="Bistakon Critical Claw">
|
||||
<abnormalLvl>3</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
@@ -604,6 +604,7 @@
|
||||
<skill id="6437" toLevel="7" name="Freezing Core Area">
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -640,6 +641,7 @@
|
||||
<skill id="6438" toLevel="1" name="Penalty Area">
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>15</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -715,6 +715,7 @@
|
||||
<!-- "For 5 seconds, inflicted with poison with 800 HP decrease per second." -->
|
||||
<operateType>A2</operateType>
|
||||
<effectPoint>-100</effectPoint>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<basicProperty>PHYSICAL</basicProperty>
|
||||
<rideState>NONE</rideState>
|
||||
@@ -882,6 +883,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>120</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>30</activateRate>
|
||||
@@ -1172,6 +1174,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>120</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1833,6 +1836,7 @@
|
||||
<!-- High Five Skill -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
<skill id="6815" toLevel="16" name="Deadly Poison">
|
||||
<!-- "Poison seeps deeper and for 10 seconds, 800 HP is decreased every second. If not treated, the poison will worsen." -->
|
||||
<operateType>A2</operateType>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<basicProperty>PHYSICAL</basicProperty>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
@@ -490,6 +491,7 @@
|
||||
<skill id="6816" toLevel="16" name="Deadly Bleed">
|
||||
<!-- "Bleed becomes deeper and for 10 seconds, 800 HP is decreased every second. If not treated, the bleed will worsen." -->
|
||||
<operateType>A2</operateType>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<basicProperty>PHYSICAL</basicProperty>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
@@ -723,6 +725,7 @@
|
||||
<effectPoint>-10000</effectPoint>
|
||||
<icon>icon.skill0096</icon>
|
||||
<operateType>A2</operateType>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
<magicCriticalRate>-5</magicCriticalRate>
|
||||
@@ -825,6 +828,7 @@
|
||||
<effectPoint>-10000</effectPoint>
|
||||
<icon>icon.skill0096</icon>
|
||||
<operateType>A2</operateType>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
<magicCriticalRate>-5</magicCriticalRate>
|
||||
@@ -1493,6 +1497,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>6</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>70</activateRate>
|
||||
@@ -1525,6 +1530,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>10</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -1570,6 +1576,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>9</abnormalLvl>
|
||||
<abnormalTime>8</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<castRange>100</castRange>
|
||||
@@ -1824,6 +1831,7 @@
|
||||
<!-- FIXME: value unconfirmed -->
|
||||
<abnormalLvl>10</abnormalLvl>
|
||||
<abnormalTime>8</abnormalTime>
|
||||
<subordinationAbnormalType>POISON</subordinationAbnormalType>
|
||||
<abnormalType>POISON</abnormalType>
|
||||
<abnormalVisualEffect>DOT_POISON</abnormalVisualEffect>
|
||||
<activateRate>80</activateRate>
|
||||
@@ -2255,6 +2263,7 @@
|
||||
<!-- "For 10 seconds, inflicts bleed and decreases 100 HP every second." -->
|
||||
<operateType>A2</operateType>
|
||||
<effectPoint>-10000</effectPoint>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<basicProperty>PHYSICAL</basicProperty>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
|
||||
@@ -1469,6 +1469,7 @@
|
||||
<skill id="7067" toLevel="1" name="Test Range Charge">
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
@@ -1571,6 +1572,7 @@
|
||||
<skill id="7076" toLevel="1" name="Test - Delay Debuff">
|
||||
<abnormalLvl>8</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<activateRate>100</activateRate>
|
||||
|
||||
+44
-14
@@ -151,6 +151,7 @@
|
||||
<mpConsume>10</mpConsume>
|
||||
<hitTime>2000</hitTime>
|
||||
<effectPoint>-100</effectPoint>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<basicProperty>NONE</basicProperty>
|
||||
<rideState>NONE</rideState>
|
||||
@@ -1347,15 +1348,19 @@
|
||||
<affectScope>SINGLE</affectScope>
|
||||
</skill>
|
||||
<skill id="15291" toLevel="1" name="Bleed">
|
||||
<!-- AUTO GENERATED SKILL -->
|
||||
<!-- Glory Days confirmed -->
|
||||
<!-- Energy that formed in Lidia's room because Giselle von Hellmann and Alfred von Hellmann were not eliminated. HP continues to decrease. -->
|
||||
<abnormalLvl>2</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<subordinationAbnormalType>BLEEDING</subordinationAbnormalType>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<icon>icon.skill0096</icon>
|
||||
<operateType>A2</operateType>
|
||||
<mpConsume>10</mpConsume>
|
||||
<reuseDelay>5000</reuseDelay>
|
||||
<isMagic>1</isMagic>
|
||||
<effectPoint>-100</effectPoint>
|
||||
<abnormalType>BLEEDING</abnormalType>
|
||||
<basicProperty>NONE</basicProperty>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
<magicCriticalRate>-5</magicCriticalRate>
|
||||
@@ -1363,53 +1368,78 @@
|
||||
<lvlBonusRate>2</lvlBonusRate>
|
||||
<activateRate>100</activateRate>
|
||||
<magicLvl>95</magicLvl>
|
||||
<abnormalLvl>2</abnormalLvl>
|
||||
<abnormalTime>20</abnormalTime>
|
||||
<trait>BLEED</trait>
|
||||
<abnormalVisualEffect>DOT_BLEEDING</abnormalVisualEffect>
|
||||
<isDebuff>true</isDebuff>
|
||||
<targetType>ENEMY_ONLY</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="DamOverTime">
|
||||
<power>900</power>
|
||||
<ticks>5</ticks>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="15292" toLevel="1" name="Logan's Revenge">
|
||||
<!-- AUTO GENERATED SKILL -->
|
||||
<!-- Glory Days confirmed -->
|
||||
<!-- Logan's revenge left in his dying breath. Lidia's Atk. Spd. is greatly increased. -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>180</abnormalTime>
|
||||
<abnormalType>SPEED_UP</abnormalType>
|
||||
<icon>icon.skill0168</icon>
|
||||
<operateType>A2</operateType>
|
||||
<mpConsume>10</mpConsume>
|
||||
<reuseDelay>5000</reuseDelay>
|
||||
<abnormalType>SPEED_UP</abnormalType>
|
||||
<basicProperty>NONE</basicProperty>
|
||||
<rideState>NONE</rideState>
|
||||
<magicCriticalRate>-5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<magicLvl>95</magicLvl>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>180</abnormalTime>
|
||||
<isMagic>1</isMagic>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="PhysicalAttackSpeed">
|
||||
<amount>30</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="15293" toLevel="1" name="Logan's Revenge">
|
||||
<!-- AUTO GENERATED SKILL -->
|
||||
<!-- Glory Days confirmed -->
|
||||
<!-- Logan's revenge left in his dying breath. Momentarily invincible. -->
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>40</abnormalTime>
|
||||
<abnormalType>INVINCIBILITY_SPECIAL</abnormalType>
|
||||
<abnormalVisualEffect>ULTIMATE_DEFENCE</abnormalVisualEffect>
|
||||
<icon>icon.skill11758</icon>
|
||||
<operateType>A2</operateType>
|
||||
<mpConsume>10</mpConsume>
|
||||
<reuseDelay>5000</reuseDelay>
|
||||
<effectPoint>867</effectPoint>
|
||||
<abnormalType>INVINCIBILITY_SPECIAL</abnormalType>
|
||||
<basicProperty>NONE</basicProperty>
|
||||
<rideState>NONE;STRIDER;WYVERN;WOLF</rideState>
|
||||
<magicCriticalRate>-5</magicCriticalRate>
|
||||
<magicLvl>95</magicLvl>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>40</abnormalTime>
|
||||
<staticReuse>true</staticReuse>
|
||||
<abnormalVisualEffect>ULTIMATE_DEFENCE</abnormalVisualEffect>
|
||||
<isMagic>1</isMagic>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="DamageBlock">
|
||||
<type>BLOCK_HP</type>
|
||||
</effect>
|
||||
<effect name="DamageBlock">
|
||||
<type>BLOCK_MP</type>
|
||||
</effect>
|
||||
<effect name="DebuffBlock" />
|
||||
<effect name="ResistDispelByCategory">
|
||||
<amount>-100</amount>
|
||||
<slot>ALL</slot>
|
||||
</effect>
|
||||
<effect name="BlockAbnormalSlot">
|
||||
<slot>INVINCIBILITY_SPECIAL</slot>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="15294" toLevel="1" name="Logan's Revenge">
|
||||
<!-- AUTO GENERATED SKILL -->
|
||||
|
||||
+434
-135
File diff suppressed because it is too large
Load Diff
+14
-6
@@ -53,7 +53,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableFact
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableHate;
|
||||
import com.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.model.skills.SkillCaster;
|
||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||
@@ -350,6 +349,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
||||
_globalAggro--;
|
||||
}
|
||||
}
|
||||
|
||||
// Add all autoAttackable L2Character in L2Attackable Aggro Range to its _aggroList with 0 damage and 1 hate
|
||||
// A L2Attackable isn't aggressive during 10s after its spawn because _globalAggro is set to -10
|
||||
if (_globalAggro >= 0)
|
||||
@@ -931,8 +931,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
||||
// Skip if target is already affected by such skill.
|
||||
if (skill.isContinuous())
|
||||
{
|
||||
final BuffInfo info = ((L2Character) target).getEffectList().getBuffInfoByAbnormalType(skill.getAbnormalType());
|
||||
if ((info != null) && (info.getSkill().getAbnormalLvl() >= skill.getAbnormalLvl()))
|
||||
if (((L2Character) target).getEffectList().hasAbnormalType(skill.getAbnormalType(), i -> (i.getSkill().getAbnormalLvl() >= skill.getAbnormalLvl())))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// There are cases where bad skills (negative effect points) are actually buffs and NPCs cast them on players, but they shouldn't.
|
||||
if ((!skill.isDebuff() || !skill.isBad()) && target.isAutoAttackable(getActiveChar()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -943,12 +948,12 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
||||
{
|
||||
if (skill.isBad())
|
||||
{
|
||||
if (!((L2Character) target).getEffectList().hasBuffs() && !((L2Character) target).getEffectList().hasDances())
|
||||
if (((L2Character) target).getEffectList().getBuffCount() == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!((L2Character) target).getEffectList().hasDebuffs())
|
||||
else if (((L2Character) target).getEffectList().getDebuffCount() == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1011,11 +1016,14 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
||||
return null;
|
||||
}
|
||||
|
||||
// There are cases where bad skills (negative effect points) are actually buffs and NPCs cast them on players, but they shouldn't.
|
||||
final boolean isBad = skill.isContinuous() ? skill.isDebuff() : skill.isBad();
|
||||
|
||||
// Check current target first.
|
||||
final int range = insideCastRange ? skill.getCastRange() + getActiveChar().getTemplate().getCollisionRadius() : 2000; // TODO need some forget range
|
||||
|
||||
Stream<L2Character> stream;
|
||||
if (skill.isBad())
|
||||
if (isBad)
|
||||
{
|
||||
//@formatter:off
|
||||
stream = npc.getAggroList().values().stream()
|
||||
|
||||
+640
-1009
File diff suppressed because it is too large
Load Diff
+11
-106
@@ -19,14 +19,11 @@ package com.l2jmobius.gameserver.model.actor;
|
||||
import static com.l2jmobius.gameserver.ai.CtrlIntention.AI_INTENTION_ACTIVE;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
@@ -39,7 +36,6 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.EmptyQueue;
|
||||
@@ -120,7 +116,6 @@ import com.l2jmobius.gameserver.model.items.type.WeaponType;
|
||||
import com.l2jmobius.gameserver.model.options.OptionsSkillHolder;
|
||||
import com.l2jmobius.gameserver.model.options.OptionsSkillType;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalVisualEffect;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.CommonSkill;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
@@ -246,9 +241,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
|
||||
private SkillChannelized _channelized = null;
|
||||
|
||||
private volatile Set<AbnormalVisualEffect> _abnormalVisualEffects;
|
||||
private volatile Set<AbnormalVisualEffect> _currentAbnormalVisualEffects;
|
||||
|
||||
private Optional<Transform> _transform = Optional.empty();
|
||||
|
||||
/** Movement data of this L2Character */
|
||||
@@ -2523,95 +2515,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
*/
|
||||
public final void setWalking()
|
||||
{
|
||||
if (isRunning())
|
||||
{
|
||||
setIsRunning(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the abnormal visual effects recalculating all of them that are applied from skills and sending packet for updating them on client if a change is found.
|
||||
*/
|
||||
public void resetCurrentAbnormalVisualEffects()
|
||||
{
|
||||
final Collection<BuffInfo> passives = getEffectList().hasPassives() ? new ArrayList<>(getEffectList().getPassives()) : null;
|
||||
//@formatter:off
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = Stream.concat(getEffectList().getEffects().stream(), passives != null ? passives.stream() : Stream.empty())
|
||||
.filter(Objects::nonNull)
|
||||
.map(BuffInfo::getSkill)
|
||||
.filter(Skill::hasAbnormalVisualEffects)
|
||||
.flatMap(s -> s.getAbnormalVisualEffects().stream())
|
||||
.collect(Collectors.toCollection(HashSet::new));
|
||||
//@formatter:on
|
||||
|
||||
if (_abnormalVisualEffects != null)
|
||||
{
|
||||
abnormalVisualEffects.addAll(_abnormalVisualEffects);
|
||||
}
|
||||
|
||||
if ((_currentAbnormalVisualEffects == null) || !_currentAbnormalVisualEffects.equals(abnormalVisualEffects))
|
||||
{
|
||||
_currentAbnormalVisualEffects = Collections.unmodifiableSet(abnormalVisualEffects);
|
||||
updateAbnormalVisualEffects();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the currently applied abnormal visual effects.
|
||||
* @return the abnormal visual effects
|
||||
*/
|
||||
public Set<AbnormalVisualEffect> getCurrentAbnormalVisualEffects()
|
||||
{
|
||||
return _currentAbnormalVisualEffects != null ? _currentAbnormalVisualEffects : Collections.emptySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the creature has the abnormal visual effect.
|
||||
* @param ave the abnormal visual effect
|
||||
* @return {@code true} if the creature has the abnormal visual effect, {@code false} otherwise
|
||||
*/
|
||||
public boolean hasAbnormalVisualEffect(AbnormalVisualEffect ave)
|
||||
{
|
||||
return (_abnormalVisualEffects != null) && _abnormalVisualEffects.contains(ave);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the abnormal visual and sends packet for updating them in client.
|
||||
* @param aves the abnormal visual effects
|
||||
*/
|
||||
public final void startAbnormalVisualEffect(AbnormalVisualEffect... aves)
|
||||
{
|
||||
for (AbnormalVisualEffect ave : aves)
|
||||
{
|
||||
if (_abnormalVisualEffects == null)
|
||||
{
|
||||
synchronized (this)
|
||||
{
|
||||
if (_abnormalVisualEffects == null)
|
||||
{
|
||||
_abnormalVisualEffects = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||
}
|
||||
}
|
||||
}
|
||||
_abnormalVisualEffects.add(ave);
|
||||
}
|
||||
resetCurrentAbnormalVisualEffects();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the abnormal visual and sends packet for updating them in client.
|
||||
* @param aves the abnormal visual effects
|
||||
*/
|
||||
public final void stopAbnormalVisualEffect(AbnormalVisualEffect... aves)
|
||||
{
|
||||
if (_abnormalVisualEffects != null)
|
||||
{
|
||||
for (AbnormalVisualEffect ave : aves)
|
||||
{
|
||||
_abnormalVisualEffects.remove(ave);
|
||||
}
|
||||
resetCurrentAbnormalVisualEffects();
|
||||
}
|
||||
setIsRunning(false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2672,11 +2576,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
_effectList.stopSkillEffects(true, skill.getId());
|
||||
}
|
||||
|
||||
public final void stopEffects(AbnormalType abnormalType)
|
||||
{
|
||||
_effectList.stopSkillEffects(true, abnormalType);
|
||||
}
|
||||
|
||||
public final void stopEffects(EffectFlag effectFlag)
|
||||
{
|
||||
_effectList.stopEffects(effectFlag);
|
||||
@@ -2737,7 +2636,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
{
|
||||
if (removeEffects)
|
||||
{
|
||||
stopEffects(AbnormalType.STUN);
|
||||
getEffectList().stopEffects(AbnormalType.STUN);
|
||||
}
|
||||
|
||||
if (!isPlayer())
|
||||
@@ -2760,8 +2659,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
{
|
||||
if (removeEffects)
|
||||
{
|
||||
getEffectList().stopSkillEffects(false, AbnormalType.TRANSFORM);
|
||||
getEffectList().stopSkillEffects(false, AbnormalType.CHANGEBODY);
|
||||
getEffectList().stopEffects(AbnormalType.TRANSFORM);
|
||||
getEffectList().stopEffects(AbnormalType.CHANGEBODY);
|
||||
}
|
||||
|
||||
if (isTransformed())
|
||||
@@ -2776,7 +2675,13 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
||||
updateAbnormalVisualEffects();
|
||||
}
|
||||
|
||||
public abstract void updateAbnormalVisualEffects();
|
||||
/**
|
||||
* Updates the visual abnormal state of this character. <br>
|
||||
*/
|
||||
public void updateAbnormalVisualEffects()
|
||||
{
|
||||
// overridden
|
||||
}
|
||||
|
||||
/**
|
||||
* Update active skills in progress (In Use and Not In Use because stacked) icons on client.<br>
|
||||
|
||||
-1
@@ -196,7 +196,6 @@ public abstract class L2Playable extends L2Character
|
||||
|
||||
// Notify L2Character AI
|
||||
getAI().notifyEvent(CtrlEvent.EVT_DEAD);
|
||||
super.updateEffectIcons();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -796,7 +796,6 @@ public abstract class L2Summon extends L2Playable
|
||||
{
|
||||
party.broadcastToPartyMembers(getOwner(), new ExPartyPetWindowUpdate(this));
|
||||
}
|
||||
updateEffectIcons(true);
|
||||
}
|
||||
|
||||
public void broadcastNpcInfo(int val)
|
||||
@@ -841,8 +840,6 @@ public abstract class L2Summon extends L2Playable
|
||||
if (activeChar == getOwner())
|
||||
{
|
||||
activeChar.sendPacket(new PetInfo(this, isDead() ? 0 : 1));
|
||||
// The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them
|
||||
updateEffectIcons(true);
|
||||
if (isPet())
|
||||
{
|
||||
activeChar.sendPacket(new PetItemList(getInventory().getItems()));
|
||||
|
||||
-5
@@ -426,11 +426,6 @@ public abstract class L2Vehicle extends L2Character
|
||||
return super.deleteMe();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAbnormalVisualEffects()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public L2ItemInstance getActiveWeaponInstance()
|
||||
{
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ public class DoppelgangerInstance extends L2Npc
|
||||
|
||||
if (_copySummonerEffects && (getSummoner() != null))
|
||||
{
|
||||
for (BuffInfo summonerInfo : getSummoner().getEffectList().getBuffs())
|
||||
for (BuffInfo summonerInfo : getSummoner().getEffectList().getEffects())
|
||||
{
|
||||
if (summonerInfo.getAbnormalTime() > 0)
|
||||
{
|
||||
|
||||
-5
@@ -327,11 +327,6 @@ public final class L2DoorInstance extends L2Character
|
||||
return (isCastle || isFort);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAbnormalVisualEffects()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Return null.
|
||||
*/
|
||||
|
||||
+3
-10
@@ -8468,12 +8468,6 @@ public final class L2PcInstance extends L2Playable
|
||||
updateAndBroadcastStatus(2);
|
||||
}
|
||||
|
||||
public final void stopAllEffectsNotStayOnSubclassChange()
|
||||
{
|
||||
getEffectList().stopAllEffectsNotStayOnSubclassChange();
|
||||
updateAndBroadcastStatus(2);
|
||||
}
|
||||
|
||||
public final void stopCubics()
|
||||
{
|
||||
if (!_cubics.isEmpty())
|
||||
@@ -8866,7 +8860,7 @@ public final class L2PcInstance extends L2Playable
|
||||
setLastLocation();
|
||||
|
||||
// Remove Hide.
|
||||
getEffectList().stopSkillEffects(true, AbnormalType.HIDE);
|
||||
getEffectList().stopEffects(AbnormalType.HIDE);
|
||||
|
||||
setObserving(true);
|
||||
sendPacket(new ObservationMode(loc));
|
||||
@@ -8900,7 +8894,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
|
||||
// Remove Hide.
|
||||
getEffectList().stopSkillEffects(true, AbnormalType.HIDE);
|
||||
getEffectList().stopEffects(AbnormalType.HIDE);
|
||||
|
||||
if (!_cubics.isEmpty())
|
||||
{
|
||||
@@ -9757,7 +9751,7 @@ public final class L2PcInstance extends L2Playable
|
||||
}
|
||||
|
||||
stopAllEffectsExceptThoseThatLastThroughDeath();
|
||||
stopAllEffectsNotStayOnSubclassChange();
|
||||
stopAllEffects();
|
||||
stopCubics();
|
||||
|
||||
restoreRecipeBook(false);
|
||||
@@ -10013,7 +10007,6 @@ public final class L2PcInstance extends L2Playable
|
||||
public void doRevive()
|
||||
{
|
||||
super.doRevive();
|
||||
updateEffectIcons();
|
||||
sendPacket(new EtcStatusUpdate(this));
|
||||
_revivePet = false;
|
||||
_reviveRequested = 0;
|
||||
|
||||
-1
@@ -573,7 +573,6 @@ public class L2ServitorInstance extends L2Summon implements Runnable
|
||||
}
|
||||
|
||||
sendPacket(new SetSummonRemainTime(getLifeTime(), _lifeTimeRemaining));
|
||||
updateEffectIcons();
|
||||
|
||||
// Using same task to check if owner is in visible range
|
||||
if (calculateDistance(getOwner(), true, false) > 2000)
|
||||
|
||||
-5
@@ -178,11 +178,6 @@ public final class L2StaticObjectInstance extends L2Character
|
||||
return _meshIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAbnormalVisualEffects()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendInfo(L2PcInstance activeChar)
|
||||
{
|
||||
|
||||
-6
@@ -361,12 +361,6 @@ public final class L2TrapInstance extends L2Npc
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAbnormalVisualEffects()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public boolean hasLifeTime()
|
||||
{
|
||||
return _hasLifeTime;
|
||||
|
||||
+1
-1
@@ -663,7 +663,7 @@ public class L2VillageMasterInstance extends L2NpcInstance
|
||||
{
|
||||
player.abortCast();
|
||||
player.stopAllEffectsExceptThoseThatLastThroughDeath(); // all effects from old subclass stopped!
|
||||
player.stopAllEffectsNotStayOnSubclassChange();
|
||||
player.stopAllEffects();
|
||||
player.stopCubics();
|
||||
player.setActiveClass(paramOne);
|
||||
|
||||
|
||||
+3
-3
@@ -773,9 +773,9 @@ public class CharStat
|
||||
|
||||
// Collect all necessary effects
|
||||
final CharEffectList effectList = _activeChar.getEffectList();
|
||||
final Stream<BuffInfo> passives = effectList.hasPassives() ? effectList.getPassives().stream().filter(info -> info.getSkill().checkConditions(SkillConditionScope.PASSIVE, _activeChar, _activeChar)) : null;
|
||||
final Stream<BuffInfo> options = effectList.hasOptions() ? effectList.getOptions().stream() : null;
|
||||
final Stream<BuffInfo> effectsStream = Stream.concat(effectList.getEffects().stream(), Stream.concat(passives != null ? passives : Stream.empty(), options != null ? options : Stream.empty()));
|
||||
final Stream<BuffInfo> passives = effectList.getPassives().stream().filter(BuffInfo::isInUse).filter(info -> info.getSkill().checkConditions(SkillConditionScope.PASSIVE, _activeChar, _activeChar));
|
||||
final Stream<BuffInfo> options = effectList.getOptions().stream().filter(BuffInfo::isInUse);
|
||||
final Stream<BuffInfo> effectsStream = Stream.concat(effectList.getEffects().stream().filter(BuffInfo::isInUse), Stream.concat(passives != null ? passives : Stream.empty(), options != null ? options : Stream.empty()));
|
||||
|
||||
// Call pump to each effect
|
||||
//@formatter:off
|
||||
|
||||
-3
@@ -38,9 +38,6 @@ public class PetStat extends SummonStat
|
||||
}
|
||||
|
||||
getActiveChar().updateAndBroadcastStatus(1);
|
||||
// The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them
|
||||
getActiveChar().updateEffectIcons(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -172,7 +172,7 @@ public class CharStatus
|
||||
}
|
||||
if (Formulas.calcRealTargetBreak())
|
||||
{
|
||||
getActiveChar().getEffectList().stopSkillEffects(true, AbnormalType.REAL_TARGET);
|
||||
getActiveChar().getEffectList().stopEffects(AbnormalType.REAL_TARGET);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ public class PcStatus extends PlayableStatus
|
||||
}
|
||||
if (Formulas.calcRealTargetBreak())
|
||||
{
|
||||
getActiveChar().getEffectList().stopSkillEffects(true, AbnormalType.REAL_TARGET);
|
||||
getActiveChar().getEffectList().stopEffects(AbnormalType.REAL_TARGET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -394,8 +394,8 @@ public final class Transform implements IIdentifiable
|
||||
|
||||
player.sendPacket(ExBasicActionList.STATIC_PACKET);
|
||||
|
||||
player.getEffectList().stopSkillEffects(false, AbnormalType.TRANSFORM);
|
||||
player.getEffectList().stopSkillEffects(false, AbnormalType.CHANGEBODY);
|
||||
player.getEffectList().stopEffects(AbnormalType.TRANSFORM);
|
||||
player.getEffectList().stopEffects(AbnormalType.CHANGEBODY);
|
||||
|
||||
if (hasTransformSkills)
|
||||
{
|
||||
|
||||
+6
-3
@@ -19,7 +19,6 @@ package com.l2jmobius.gameserver.model.conditions;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.skills.AbnormalType;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
|
||||
/**
|
||||
@@ -55,7 +54,11 @@ public class ConditionPlayerCheckAbnormal extends Condition
|
||||
@Override
|
||||
public boolean testImpl(L2Character effector, L2Character effected, Skill skill, L2Item item)
|
||||
{
|
||||
final BuffInfo info = effector.getEffectList().getBuffInfoByAbnormalType(_type);
|
||||
return ((info != null) && ((_level == -1) || (_level >= info.getSkill().getAbnormalLvl())));
|
||||
if (_level == -1)
|
||||
{
|
||||
return effector.getEffectList().hasAbnormalType(_type);
|
||||
}
|
||||
|
||||
return effector.getEffectList().hasAbnormalType(_type, info -> _level >= info.getSkill().getAbnormalLvl());
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ public class CubicSkill extends SkillHolder implements ICubicConditionHolder
|
||||
@Override
|
||||
public boolean validateConditions(CubicInstance cubic, L2Character owner, L2Character target)
|
||||
{
|
||||
return (!_targetDebuff || (_targetDebuff && target.getEffectList().hasDebuffs())) && (_conditions.isEmpty() || _conditions.stream().allMatch(condition -> condition.test(cubic, owner, target)));
|
||||
return (!_targetDebuff || (_targetDebuff && (target.getEffectList().getDebuffCount() > 0))) && (_conditions.isEmpty() || _conditions.stream().allMatch(condition -> condition.test(cubic, owner, target)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-8
@@ -48,7 +48,6 @@ import com.l2jmobius.gameserver.model.instancezone.conditions.ConditionGroupMax;
|
||||
import com.l2jmobius.gameserver.model.instancezone.conditions.ConditionGroupMin;
|
||||
import com.l2jmobius.gameserver.model.interfaces.IIdentifiable;
|
||||
import com.l2jmobius.gameserver.model.interfaces.INamable;
|
||||
import com.l2jmobius.gameserver.model.skills.BuffInfo;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.model.spawns.SpawnTemplate;
|
||||
import com.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||
@@ -509,13 +508,8 @@ public class InstanceTemplate extends ListenersContainer implements IIdentifiabl
|
||||
{
|
||||
for (L2Playable playable : affected)
|
||||
{
|
||||
for (BuffInfo info : playable.getEffectList().getBuffs())
|
||||
{
|
||||
if (hasRemoveBuffException(info.getSkill()))
|
||||
{
|
||||
playable.stopSkillEffects(info.getSkill());
|
||||
}
|
||||
}
|
||||
// Stop all buffs.
|
||||
playable.getEffectList().stopEffects(info -> !info.getSkill().isIrreplacableBuff() && info.getSkill().getBuffType().isBuff() && hasRemoveBuffException(info.getSkill()), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -204,7 +204,7 @@ public class Options
|
||||
if (info.getOption() == this)
|
||||
{
|
||||
player.sendDebugMessage("Removing effects: " + info.getEffects());
|
||||
player.getEffectList().remove(false, info, this);
|
||||
player.getEffectList().remove(info, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+34
-32
@@ -46,6 +46,7 @@ public final class BuffInfo
|
||||
{
|
||||
// Data
|
||||
/** Data. */
|
||||
private final int _effectorObjectId;
|
||||
private final L2Character _effector;
|
||||
private final L2Character _effected;
|
||||
private final Skill _skill;
|
||||
@@ -63,9 +64,9 @@ public final class BuffInfo
|
||||
private int _periodStartTicks;
|
||||
// Misc
|
||||
/** If {@code true} then this effect has been cancelled. */
|
||||
private boolean _isRemoved = false;
|
||||
private volatile boolean _isRemoved = false;
|
||||
/** If {@code true} then this effect is in use (or has been stop because an Herb took place). */
|
||||
private boolean _isInUse = true;
|
||||
private volatile boolean _isInUse = true;
|
||||
private final boolean _hideStartMessage;
|
||||
private final L2ItemInstance _item;
|
||||
private final Options _option;
|
||||
@@ -81,6 +82,7 @@ public final class BuffInfo
|
||||
*/
|
||||
public BuffInfo(L2Character effector, L2Character effected, Skill skill, boolean hideStartMessage, L2ItemInstance item, Options option)
|
||||
{
|
||||
_effectorObjectId = (effector != null) ? effector.getObjectId() : 0;
|
||||
_effector = effector;
|
||||
_effected = effected;
|
||||
_skill = skill;
|
||||
@@ -235,6 +237,35 @@ public final class BuffInfo
|
||||
public void setInUse(boolean val)
|
||||
{
|
||||
_isInUse = val;
|
||||
|
||||
// Send message that the effect is applied or removed.
|
||||
if ((_skill != null) && !_skill.isHidingMesseges() && _effected.isPlayer())
|
||||
{
|
||||
if (val)
|
||||
{
|
||||
if (!_hideStartMessage && !_skill.isAura())
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_S_EFFECT_CAN_BE_FELT);
|
||||
sm.addSkillName(_skill);
|
||||
_effected.sendPacket(sm);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(_skill.isToggle() ? SystemMessageId.S1_HAS_BEEN_ABORTED : SystemMessageId.THE_EFFECT_OF_S1_HAS_BEEN_REMOVED);
|
||||
sm.addSkillName(_skill);
|
||||
_effected.sendPacket(sm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the character's object id that launched the buff.
|
||||
* @return the object id of the effector.
|
||||
*/
|
||||
public int getEffectorObjectId()
|
||||
{
|
||||
return _effectorObjectId;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -281,7 +312,7 @@ public final class BuffInfo
|
||||
}
|
||||
|
||||
// When effects are initialized, the successfully landed.
|
||||
if (!_hideStartMessage && _effected.isPlayer() && !_skill.isPassive() && !_skill.isHidingMesseges() && !_skill.isAura())
|
||||
if (!_hideStartMessage && _effected.isPlayer() && !_skill.isHidingMesseges() && !_skill.isAura())
|
||||
{
|
||||
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_S_EFFECT_CAN_BE_FELT);
|
||||
sm.addSkillName(_skill);
|
||||
@@ -294,9 +325,6 @@ public final class BuffInfo
|
||||
_scheduledFutureTimeTask = ThreadPoolManager.scheduleAtFixedRate(new BuffTimeTask(this), 0, 1000L);
|
||||
}
|
||||
|
||||
// Reset abnormal visual effects.
|
||||
resetAbnormalVisualEffects();
|
||||
|
||||
for (AbstractEffect effect : _effects)
|
||||
{
|
||||
if (effect.isInstant() || (_effected.isDead() && !_skill.isPassive()))
|
||||
@@ -317,9 +345,6 @@ public final class BuffInfo
|
||||
// Adds the task for ticking.
|
||||
addTask(effect, new EffectTaskInfo(effectTask, scheduledFuture));
|
||||
}
|
||||
|
||||
// Recalculate all stats
|
||||
_effected.getStat().recalculateStats(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,12 +396,6 @@ public final class BuffInfo
|
||||
}
|
||||
}
|
||||
|
||||
// Remove abnormal visual effects.
|
||||
resetAbnormalVisualEffects();
|
||||
|
||||
// Recalculate all stats
|
||||
_effected.getStat().recalculateStats(true);
|
||||
|
||||
// Set the proper system message.
|
||||
if ((_skill != null) && !(_effected.isSummon() && !((L2Summon) _effected).getOwner().hasSummon()) && !_skill.isHidingMesseges())
|
||||
{
|
||||
@@ -401,23 +420,6 @@ public final class BuffInfo
|
||||
_effected.sendPacket(sm);
|
||||
}
|
||||
}
|
||||
// Remove short buff.
|
||||
if (this == _effected.getEffectList().getShortBuff())
|
||||
{
|
||||
_effected.getEffectList().shortBuffStatusUpdate(null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies all the abnormal visual effects to the effected.<br>
|
||||
* Prevents multiple updates.
|
||||
*/
|
||||
private void resetAbnormalVisualEffects()
|
||||
{
|
||||
if ((_skill != null) && _skill.hasAbnormalVisualEffects())
|
||||
{
|
||||
_effected.resetCurrentAbnormalVisualEffects();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+44
-3
@@ -109,6 +109,8 @@ public final class Skill implements IIdentifiable
|
||||
private final int _abnormalLvl;
|
||||
/** Abnormal type: global effect "group". */
|
||||
private final AbnormalType _abnormalType;
|
||||
/** Abnormal type: local effect "group". */
|
||||
private final AbnormalType _subordinationAbnormalType;
|
||||
/** Abnormal time: global effect duration time. */
|
||||
private final int _abnormalTime;
|
||||
/** Abnormal visual effect: the visual effect displayed ingame. */
|
||||
@@ -204,6 +206,7 @@ public final class Skill implements IIdentifiable
|
||||
private final Set<AbnormalType> _abnormalResists;
|
||||
|
||||
private final double _magicCriticalRate;
|
||||
private final SkillBuffType _buffType;
|
||||
|
||||
public Skill(StatsSet set)
|
||||
{
|
||||
@@ -229,6 +232,7 @@ public final class Skill implements IIdentifiable
|
||||
_effectRange = set.getInt("effectRange", -1);
|
||||
_abnormalLvl = set.getInt("abnormalLvl", 0);
|
||||
_abnormalType = set.getEnum("abnormalType", AbnormalType.class, AbnormalType.NONE);
|
||||
_subordinationAbnormalType = set.getEnum("subordinationAbnormalType", AbnormalType.class, AbnormalType.NONE);
|
||||
|
||||
int abnormalTime = set.getInt("abnormalTime", 0);
|
||||
if (Config.ENABLE_MODIFY_SKILL_DURATION && Config.SKILL_DURATION_LIST.containsKey(getId()))
|
||||
@@ -437,6 +441,7 @@ public final class Skill implements IIdentifiable
|
||||
}
|
||||
|
||||
_magicCriticalRate = set.getDouble("magicCriticalRate", 0);
|
||||
_buffType = isTriggeredSkill() ? SkillBuffType.TRIGGER : isToggle() ? SkillBuffType.TOGGLE : isDance() ? SkillBuffType.DANCE : isDebuff() ? SkillBuffType.DEBUFF : !isHealingPotionSkill() ? SkillBuffType.BUFF : SkillBuffType.NONE;
|
||||
}
|
||||
|
||||
public TraitType getTraitType()
|
||||
@@ -506,6 +511,15 @@ public final class Skill implements IIdentifiable
|
||||
return _abnormalType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the skill subordination abnormal type.
|
||||
* @return the abnormal type
|
||||
*/
|
||||
public AbnormalType getSubordinationAbnormalType()
|
||||
{
|
||||
return _subordinationAbnormalType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the skill abnormal level.
|
||||
* @return the skill abnormal level
|
||||
@@ -1327,7 +1341,16 @@ public final class Skill implements IIdentifiable
|
||||
|
||||
if (addContinuousEffects)
|
||||
{
|
||||
effected.getEffectList().add(info);
|
||||
// Aura skills reset the abnormal time.
|
||||
final BuffInfo existingInfo = _operateType.isAura() ? effected.getEffectList().getBuffInfoBySkillId(getId()) : null;
|
||||
if (existingInfo != null)
|
||||
{
|
||||
existingInfo.resetAbnormalTime(info.getAbnormalTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
effected.getEffectList().add(info);
|
||||
}
|
||||
|
||||
// Check for mesmerizing debuffs and increase resist level.
|
||||
if (isDebuff() && (getBasicProperty() != BasicProperty.NONE) && effected.hasBasicPropertyResist())
|
||||
@@ -1362,7 +1385,16 @@ public final class Skill implements IIdentifiable
|
||||
|
||||
if (addContinuousEffects)
|
||||
{
|
||||
info.getEffector().getEffectList().add(info);
|
||||
// Aura skills reset the abnormal time.
|
||||
final BuffInfo existingInfo = _operateType.isAura() ? effector.getEffectList().getBuffInfoBySkillId(getId()) : null;
|
||||
if (existingInfo != null)
|
||||
{
|
||||
existingInfo.resetAbnormalTime(info.getAbnormalTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
info.getEffector().getEffectList().add(info);
|
||||
}
|
||||
}
|
||||
|
||||
// Support for buff sharing feature.
|
||||
@@ -1699,7 +1731,7 @@ public final class Skill implements IIdentifiable
|
||||
}
|
||||
|
||||
//@formatter:off
|
||||
final int toggleSkillId = activeChar.getEffectList().getToggles().stream()
|
||||
final int toggleSkillId = activeChar.getEffectList().getEffects().stream()
|
||||
.filter(info -> info.getSkill().getToggleGroupId() == getAttachToggleGroupId())
|
||||
.mapToInt(info -> info.getSkill().getId())
|
||||
.findAny().orElse(0);
|
||||
@@ -1752,6 +1784,10 @@ public final class Skill implements IIdentifiable
|
||||
return _deleteAbnormalOnLeave;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@code true} if the buff cannot be replaced, canceled, removed on death, etc.<br>
|
||||
* It can be only overriden by higher stack, but buff still remains ticking and activates once the higher stack buff has passed away.
|
||||
*/
|
||||
public boolean isIrreplacableBuff()
|
||||
{
|
||||
return _irreplacableBuff;
|
||||
@@ -1795,6 +1831,11 @@ public final class Skill implements IIdentifiable
|
||||
return _magicCriticalRate;
|
||||
}
|
||||
|
||||
public SkillBuffType getBuffType()
|
||||
{
|
||||
return _buffType;
|
||||
}
|
||||
|
||||
public boolean isEnchantable()
|
||||
{
|
||||
return EnchantSkillGroupsData.getInstance().isEnchantable(this);
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.skills;
|
||||
|
||||
/**
|
||||
* A custom enum representing the buff category type of the skill.
|
||||
* @author Nik
|
||||
*/
|
||||
public enum SkillBuffType
|
||||
{
|
||||
NONE,
|
||||
BUFF,
|
||||
DEBUFF,
|
||||
DANCE,
|
||||
TOGGLE,
|
||||
TRIGGER;
|
||||
|
||||
public boolean isNone()
|
||||
{
|
||||
return this == NONE;
|
||||
}
|
||||
|
||||
public boolean isBuff()
|
||||
{
|
||||
return this == BUFF;
|
||||
}
|
||||
|
||||
public boolean isDebuff()
|
||||
{
|
||||
return this == DEBUFF;
|
||||
}
|
||||
|
||||
public boolean isDance()
|
||||
{
|
||||
return this == DANCE;
|
||||
}
|
||||
|
||||
public boolean isToggle()
|
||||
{
|
||||
return this == TOGGLE;
|
||||
}
|
||||
|
||||
public boolean isTrigger()
|
||||
{
|
||||
return this == TRIGGER;
|
||||
}
|
||||
}
|
||||
+7
-17
@@ -1136,16 +1136,10 @@ public final class Formulas
|
||||
set.set("rate", rate);
|
||||
Debug.sendSkillDebug(activeChar, target, skill, set);
|
||||
}
|
||||
|
||||
// Prevent initialization.
|
||||
final List<BuffInfo> buffs = target.getEffectList().hasBuffs() ? new ArrayList<>(target.getEffectList().getBuffs()) : new ArrayList<>(1);
|
||||
if (target.getEffectList().hasTriggered())
|
||||
{
|
||||
buffs.addAll(target.getEffectList().getTriggered());
|
||||
}
|
||||
if (target.getEffectList().hasDances())
|
||||
{
|
||||
buffs.addAll(target.getEffectList().getDances());
|
||||
}
|
||||
final List<BuffInfo> buffs = target.getEffectList().getBuffs();
|
||||
|
||||
for (int i = buffs.size() - 1; i >= 0; i--) // reverse order
|
||||
{
|
||||
final BuffInfo info = buffs.get(i);
|
||||
@@ -1163,11 +1157,11 @@ public final class Formulas
|
||||
}
|
||||
case DEBUFF:
|
||||
{
|
||||
final List<BuffInfo> debuffs = new ArrayList<>(target.getEffectList().getDebuffs());
|
||||
final List<BuffInfo> debuffs = target.getEffectList().getDebuffs();
|
||||
for (int i = debuffs.size() - 1; i >= 0; i--)
|
||||
{
|
||||
final BuffInfo info = debuffs.get(i);
|
||||
if (info.getSkill().isDebuff() && info.getSkill().canBeDispelled() && (Rnd.get(100) <= rate))
|
||||
if (info.getSkill().canBeDispelled() && (Rnd.get(100) <= rate))
|
||||
{
|
||||
canceled.add(info);
|
||||
if (canceled.size() >= max)
|
||||
@@ -1497,12 +1491,8 @@ public final class Formulas
|
||||
// Check if target is stunned and 10% chance.
|
||||
if (activeChar.hasBlockActions() && (Rnd.get(10) == 0))
|
||||
{
|
||||
final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.STUN);
|
||||
if (info != null)
|
||||
{
|
||||
// Any stun that has double duration due to skill mastery, doesn't get removed until its time reaches the usual abnormal time.
|
||||
return info.getTime() <= info.getSkill().getAbnormalTime();
|
||||
}
|
||||
// Any stun that has double duration due to skill mastery, doesn't get removed until its time reaches the usual abnormal time.
|
||||
return activeChar.getEffectList().hasAbnormalType(AbnormalType.STUN, info -> info.getTime() <= info.getSkill().getAbnormalTime());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
+1
-1
@@ -70,7 +70,7 @@ public final class Action implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
final BuffInfo info = activeChar.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
|
||||
+1
-1
@@ -73,7 +73,7 @@ public final class Attack implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
final BuffInfo info = activeChar.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public final class AttackRequest implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
final BuffInfo info = activeChar.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
|
||||
+1
-3
@@ -219,7 +219,7 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
if (Config.GM_STARTUP_INVISIBLE && AdminData.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel()))
|
||||
{
|
||||
activeChar.setInvisible(true);
|
||||
activeChar.startAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
activeChar.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.STEALTH);
|
||||
}
|
||||
|
||||
if (Config.GM_STARTUP_SILENCE && AdminData.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel()))
|
||||
@@ -464,8 +464,6 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
}
|
||||
}
|
||||
|
||||
activeChar.updateEffectIcons();
|
||||
|
||||
// Expand Skill
|
||||
activeChar.sendPacket(new ExStorageMaxCount(activeChar));
|
||||
|
||||
|
||||
+1
-1
@@ -72,7 +72,7 @@ public final class RequestActionUse implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final BuffInfo info = activeChar.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
final BuffInfo info = activeChar.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
|
||||
+2
-2
@@ -63,7 +63,7 @@ public final class TradeRequest implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
BuffInfo info = player.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
BuffInfo info = player.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
@@ -107,7 +107,7 @@ public final class TradeRequest implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
info = partner.getEffectList().getBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
info = partner.getEffectList().getFirstBuffInfoByAbnormalType(AbnormalType.BOT_PENALTY);
|
||||
if (info != null)
|
||||
{
|
||||
for (AbstractEffect effect : info.getEffects())
|
||||
|
||||
+1
-1
@@ -235,7 +235,7 @@ public class CharInfo implements IClientOutgoingPacket
|
||||
packet.writeD((int) Math.round(_activeChar.getCurrentMp())); // Confirmed
|
||||
|
||||
packet.writeC(0x00); // TODO: Find me!
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _activeChar.getCurrentAbnormalVisualEffects();
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _activeChar.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
packet.writeD(abnormalVisualEffects.size() + (_gmSeeInvis ? 1 : 0)); // Confirmed
|
||||
for (AbnormalVisualEffect abnormalVisualEffect : abnormalVisualEffects)
|
||||
{
|
||||
|
||||
+11
-15
@@ -18,6 +18,8 @@ package com.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.l2jmobius.commons.network.PacketWriter;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
@@ -60,22 +62,16 @@ public class ExAbnormalStatusUpdateFromTarget implements IClientOutgoingPacket
|
||||
|
||||
public ExAbnormalStatusUpdateFromTarget(L2Character character)
|
||||
{
|
||||
//@formatter:off
|
||||
_character = character;
|
||||
_effects = new ArrayList<>();
|
||||
|
||||
for (BuffInfo info : character.getEffectList().getEffects())
|
||||
{
|
||||
if ((info != null) && info.isInUse())
|
||||
{
|
||||
final Skill skill = info.getSkill();
|
||||
|
||||
// TODO: Check on retail if all effects should be displayed
|
||||
if (skill != null)
|
||||
{
|
||||
_effects.add(new Effect(info));
|
||||
}
|
||||
}
|
||||
}
|
||||
_effects = character.getEffectList().getEffects()
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(BuffInfo::isInUse)
|
||||
.filter(b -> !b.getSkill().isToggle())
|
||||
.map(Effect::new)
|
||||
.collect(Collectors.toList());
|
||||
//@formatter:on
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public class ExPetInfo extends AbstractMaskPacket<NpcInfoType>
|
||||
_attacker = attacker;
|
||||
_title = (summon.getOwner() != null) && summon.getOwner().isOnline() ? summon.getOwner().getName() : "";
|
||||
_val = val;
|
||||
_abnormalVisualEffects = summon.getCurrentAbnormalVisualEffects();
|
||||
_abnormalVisualEffects = summon.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
|
||||
if (summon.getTemplate().getDisplayId() != summon.getTemplate().getId())
|
||||
{
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ public class ExUserInfoAbnormalVisualEffect implements IClientOutgoingPacket
|
||||
packet.writeD(_activeChar.getObjectId());
|
||||
packet.writeD(_activeChar.getTransformationId());
|
||||
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _activeChar.getCurrentAbnormalVisualEffects();
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _activeChar.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
final boolean isInvisible = _activeChar.isInvisible();
|
||||
packet.writeD(abnormalVisualEffects.size() + (isInvisible ? 1 : 0));
|
||||
for (AbnormalVisualEffect abnormalVisualEffect : abnormalVisualEffects)
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ public class NpcInfo extends AbstractMaskPacket<NpcInfoType>
|
||||
public NpcInfo(L2Npc npc)
|
||||
{
|
||||
_npc = npc;
|
||||
_abnormalVisualEffects = npc.getCurrentAbnormalVisualEffects();
|
||||
_abnormalVisualEffects = npc.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
|
||||
addComponentType(NpcInfoType.ATTACKABLE, NpcInfoType.UNKNOWN1, NpcInfoType.ID, NpcInfoType.POSITION, NpcInfoType.ALIVE, NpcInfoType.RUNNING);
|
||||
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ public class NpcInfoAbnormalVisualEffect implements IClientOutgoingPacket
|
||||
packet.writeD(_npc.getObjectId());
|
||||
packet.writeD(_npc.getTransformationDisplayId());
|
||||
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _npc.getCurrentAbnormalVisualEffects();
|
||||
final Set<AbnormalVisualEffect> abnormalVisualEffects = _npc.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
packet.writeD(abnormalVisualEffects.size());
|
||||
for (AbnormalVisualEffect abnormalVisualEffect : abnormalVisualEffects)
|
||||
{
|
||||
|
||||
+1
-1
@@ -189,7 +189,7 @@ public class PetInfo implements IClientOutgoingPacket
|
||||
packet.writeC(_summon.getOwner().getSummonPoints()); // Used Summon Points
|
||||
packet.writeC(_summon.getOwner().getMaxSummonPoints()); // Maximum Summon Points
|
||||
|
||||
final Set<AbnormalVisualEffect> aves = _summon.getCurrentAbnormalVisualEffects();
|
||||
final Set<AbnormalVisualEffect> aves = _summon.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
packet.writeH(aves.size()); // Confirmed
|
||||
for (AbnormalVisualEffect ave : aves)
|
||||
{
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public class SummonInfo extends AbstractMaskPacket<NpcInfoType>
|
||||
_attacker = attacker;
|
||||
_title = (summon.getOwner() != null) && summon.getOwner().isOnline() ? summon.getOwner().getName() : "";
|
||||
_val = val;
|
||||
_abnormalVisualEffects = summon.getCurrentAbnormalVisualEffects();
|
||||
_abnormalVisualEffects = summon.getEffectList().getCurrentAbnormalVisualEffects();
|
||||
|
||||
if (summon.getTemplate().getDisplayId() != summon.getTemplate().getId())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user