Skip to content
Snippets Groups Projects
Commit de617c6d authored by Zoey76's avatar Zoey76
Browse files

BETA: Minor fix for [8613], let's restrict all items with Extractable Skills,...

BETA: Minor fix for [8613], let's restrict all items with Extractable Skills, not only the ones that consume an item, thanks UnAfraid and baluu for report.
parent b991da2d
No related branches found
No related tags found
No related merge requests found
...@@ -20,24 +20,19 @@ import com.l2jserver.gameserver.model.item.instance.L2ItemInstance; ...@@ -20,24 +20,19 @@ import com.l2jserver.gameserver.model.item.instance.L2ItemInstance;
import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.SystemMessageId;
/** /**
* Item skills not allowed on olympiad * Item skills not allowed on Olympiad.
*/ */
public class ItemSkills extends ItemSkillsTemplate public class ItemSkills extends ItemSkillsTemplate
{ {
/**
*
* @see com.l2jserver.gameserver.handler.IItemHandler#useItem(com.l2jserver.gameserver.model.actor.L2Playable, com.l2jserver.gameserver.model.item.instance.L2ItemInstance, boolean)
*/
@Override @Override
public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse) public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
{ {
final L2PcInstance activeChar = playable.getActingPlayer(); final L2PcInstance activeChar = playable.getActingPlayer();
if (activeChar != null && activeChar.isInOlympiadMode()) if ((activeChar != null) && activeChar.isInOlympiadMode())
{ {
activeChar.sendPacket(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT); activeChar.sendPacket(SystemMessageId.THIS_ITEM_IS_NOT_AVAILABLE_FOR_THE_OLYMPIAD_EVENT);
return; return;
} }
super.useItem(playable, item, forceUse); super.useItem(playable, item, forceUse);
} }
} }
...@@ -34,26 +34,28 @@ import com.l2jserver.gameserver.templates.skills.L2SkillType; ...@@ -34,26 +34,28 @@ import com.l2jserver.gameserver.templates.skills.L2SkillType;
import com.l2jserver.gameserver.util.L2TIntObjectHashMap; import com.l2jserver.gameserver.util.L2TIntObjectHashMap;
/** /**
* Template for item skills handler * Template for item skills handler.<br>
* Only minimum of checks * Only minimum of checks.
*/ */
public class ItemSkillsTemplate implements IItemHandler public class ItemSkillsTemplate implements IItemHandler
{ {
/**
*
* @see com.l2jserver.gameserver.handler.IItemHandler#useItem(com.l2jserver.gameserver.model.actor.L2Playable, com.l2jserver.gameserver.model.item.instance.L2ItemInstance, boolean)
*/
@Override @Override
public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse) public void useItem(L2Playable playable, L2ItemInstance item, boolean forceUse)
{ {
L2PcInstance activeChar; L2PcInstance activeChar;
boolean isPet = playable instanceof L2PetInstance; boolean isPet = playable instanceof L2PetInstance;
if (isPet) if (isPet)
{
activeChar = ((L2PetInstance) playable).getOwner(); activeChar = ((L2PetInstance) playable).getOwner();
}
else if (playable instanceof L2PcInstance) else if (playable instanceof L2PcInstance)
{
activeChar = (L2PcInstance) playable; activeChar = (L2PcInstance) playable;
}
else else
{
return; return;
}
if (!TvTEvent.onScrollUse(playable.getObjectId())) if (!TvTEvent.onScrollUse(playable.getObjectId()))
{ {
...@@ -76,8 +78,10 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -76,8 +78,10 @@ public class ItemSkillsTemplate implements IItemHandler
{ {
for (SkillHolder skillInfo : skills) for (SkillHolder skillInfo : skills)
{ {
if(skillInfo == null) if (skillInfo == null)
{
continue; continue;
}
skillId = skillInfo.getSkillId(); skillId = skillInfo.getSkillId();
skillLvl = skillInfo.getSkillLvl(); skillLvl = skillInfo.getSkillLvl();
...@@ -86,12 +90,14 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -86,12 +90,14 @@ public class ItemSkillsTemplate implements IItemHandler
if (itemSkill != null) if (itemSkill != null)
{ {
if (!itemSkill.checkCondition(playable, playable.getTarget(), false)) if (!itemSkill.checkCondition(playable, playable.getTarget(), false))
{
return; return;
}
if (playable.isSkillDisabled(itemSkill)) if (playable.isSkillDisabled(itemSkill))
{ {
reuse(activeChar,itemSkill, item); reuse(activeChar, itemSkill, item);
return ; return;
} }
if (!itemSkill.isPotion() && playable.isCastingNow()) if (!itemSkill.isPotion() && playable.isCastingNow())
...@@ -99,7 +105,7 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -99,7 +105,7 @@ public class ItemSkillsTemplate implements IItemHandler
return; return;
} }
if (itemSkill.getItemConsumeId() == 0 && itemSkill.getItemConsume() > 0 && (itemSkill.isPotion() || itemSkill.isSimultaneousCast())) if ((itemSkill.getItemConsumeId() == 0) && (itemSkill.getItemConsume() > 0) && (itemSkill.isPotion() || itemSkill.isSimultaneousCast()))
{ {
if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false)) if (!playable.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false))
{ {
...@@ -119,7 +125,7 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -119,7 +125,7 @@ public class ItemSkillsTemplate implements IItemHandler
{ {
switch (skillId) switch (skillId)
{ {
// short buff icon for healing potions // short buff icon for healing potions
case 2031: case 2031:
case 2032: case 2032:
case 2037: case 2037:
...@@ -127,16 +133,21 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -127,16 +133,21 @@ public class ItemSkillsTemplate implements IItemHandler
case 26026: case 26026:
int buffId = activeChar._shortBuffTaskSkillId; int buffId = activeChar._shortBuffTaskSkillId;
// greater healing potions // greater healing potions
if (skillId == 2037 || skillId == 26025) if ((skillId == 2037) || (skillId == 26025))
activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000); {
// healing potions activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration() / 1000);
else if ((skillId == 2032 || skillId == 26026) && buffId !=2037 && buffId != 26025) }
activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000); else if (((skillId == 2032) || (skillId == 26026)) && (buffId != 2037) && (buffId != 26025))
// lesser healing potions {
activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration() / 1000);
// lesser healing potions
}
else else
{ {
if (buffId != 2037 && buffId != 26025 && buffId != 2032 && buffId != 26026) if ((buffId != 2037) && (buffId != 26025) && (buffId != 2032) && (buffId != 26026))
activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration()/1000); {
activeChar.shortBuffStatusUpdate(skillId, skillLvl, itemSkill.getBuffDuration() / 1000);
}
} }
break; break;
} }
...@@ -146,27 +157,29 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -146,27 +157,29 @@ public class ItemSkillsTemplate implements IItemHandler
{ {
playable.doSimultaneousCast(itemSkill); playable.doSimultaneousCast(itemSkill);
// Summons should be affected by herbs too, self time effect is handled at L2Effect constructor // Summons should be affected by herbs too, self time effect is handled at L2Effect constructor
if (!isPet && item.getItemType() == L2EtcItemType.HERB if (!isPet && (item.getItemType() == L2EtcItemType.HERB) && (activeChar.getPet() != null) && (activeChar.getPet() instanceof L2SummonInstance))
&& activeChar.getPet() != null {
&& activeChar.getPet() instanceof L2SummonInstance)
activeChar.getPet().doSimultaneousCast(itemSkill); activeChar.getPet().doSimultaneousCast(itemSkill);
}
} }
else else
{ {
playable.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); playable.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
// TODO: Remove when reuse time for sub-class is implemented. // TODO: Remove when reuse time for sub-class is implemented.
if (activeChar.isSubClassActive() && (itemSkill.getSkillType() == L2SkillType.EXTRACTABLE) && (itemSkill.getReuseDelay() > 5000) && (itemSkill.getItemConsumeId() == 0) && (itemSkill.getItemConsume() > 0)) if (activeChar.isSubClassActive() && (itemSkill.getSkillType() == L2SkillType.EXTRACTABLE) && (itemSkill.getReuseDelay() > 5000))
{ {
activeChar.sendPacket(SystemMessageId.MAIN_CLASS_SKILL_ONLY); activeChar.sendPacket(SystemMessageId.MAIN_CLASS_SKILL_ONLY);
return; return;
} }
if (!playable.useMagic(itemSkill, forceUse, false)) if (!playable.useMagic(itemSkill, forceUse, false))
{
return; return;
}
// Consume. // Consume.
if (itemSkill.getItemConsumeId() == 0 && itemSkill.getItemConsume() > 0) if ((itemSkill.getItemConsumeId() == 0) && (itemSkill.getItemConsume() > 0))
{ {
if (!activeChar.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false)) if (!activeChar.destroyItem("Consume", item.getObjectId(), itemSkill.getItemConsume(), null, false))
{ {
...@@ -179,39 +192,47 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -179,39 +192,47 @@ public class ItemSkillsTemplate implements IItemHandler
if (itemSkill.getReuseDelay() > 0) if (itemSkill.getReuseDelay() > 0)
{ {
activeChar.addTimeStamp(itemSkill, itemSkill.getReuseDelay()); activeChar.addTimeStamp(itemSkill, itemSkill.getReuseDelay());
//activeChar.disableSkill(itemSkill, itemSkill.getReuseDelay()); // activeChar.disableSkill(itemSkill, itemSkill.getReuseDelay());
if (item.isEtcItem()) if (item.isEtcItem())
{ {
final int group = item.getEtcItem().getSharedReuseGroup(); final int group = item.getEtcItem().getSharedReuseGroup();
if (group >= 0) if (group >= 0)
{
activeChar.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, itemSkill.getReuseDelay(), itemSkill.getReuseDelay())); activeChar.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, itemSkill.getReuseDelay(), itemSkill.getReuseDelay()));
}
} }
} }
} }
} }
} }
else else
_log.info("Item "+ item + " does not have registered any skill for handler."); {
_log.info("Item " + item + " does not have registered any skill for handler.");
}
} }
private void reuse(L2PcInstance player,L2Skill skill, L2ItemInstance item) private void reuse(L2PcInstance player, L2Skill skill, L2ItemInstance item)
{ {
SystemMessage sm = null; SystemMessage sm = null;
final L2TIntObjectHashMap<TimeStamp> timeStamp = player.getReuseTimeStamp(); final L2TIntObjectHashMap<TimeStamp> timeStamp = player.getReuseTimeStamp();
if (timeStamp != null && timeStamp.containsKey(skill.getReuseHashCode())) if ((timeStamp != null) && timeStamp.containsKey(skill.getReuseHashCode()))
{ {
final long remainingTime = player.getReuseTimeStamp().get(skill.getReuseHashCode()).getRemaining(); final long remainingTime = player.getReuseTimeStamp().get(skill.getReuseHashCode()).getRemaining();
final int hours = (int)(remainingTime / 3600000L); final int hours = (int) (remainingTime / 3600000L);
final int minutes = (int)(remainingTime % 3600000L) / 60000; final int minutes = (int) (remainingTime % 3600000L) / 60000;
final int seconds = (int)(remainingTime / 1000 % 60); final int seconds = (int) ((remainingTime / 1000) % 60);
if (hours > 0) if (hours > 0)
{ {
sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1); sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HOURS_S3_MINUTES_S4_SECONDS_REMAINING_FOR_REUSE_S1);
if (skill.isPotion()) if (skill.isPotion())
{
sm.addItemName(item); sm.addItemName(item);
}
else else
{
sm.addSkillName(skill); sm.addSkillName(skill);
}
sm.addNumber(hours); sm.addNumber(hours);
sm.addNumber(minutes); sm.addNumber(minutes);
} }
...@@ -219,18 +240,26 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -219,18 +240,26 @@ public class ItemSkillsTemplate implements IItemHandler
{ {
sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1); sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1);
if (skill.isPotion()) if (skill.isPotion())
{
sm.addItemName(item); sm.addItemName(item);
}
else else
{
sm.addSkillName(skill); sm.addSkillName(skill);
}
sm.addNumber(minutes); sm.addNumber(minutes);
} }
else else
{ {
sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1); sm = SystemMessage.getSystemMessage(SystemMessageId.S2_SECONDS_REMAINING_FOR_REUSE_S1);
if (skill.isPotion()) if (skill.isPotion())
{
sm.addItemName(item); sm.addItemName(item);
}
else else
{
sm.addSkillName(skill); sm.addSkillName(skill);
}
} }
sm.addNumber(seconds); sm.addNumber(seconds);
...@@ -238,7 +267,9 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -238,7 +267,9 @@ public class ItemSkillsTemplate implements IItemHandler
{ {
final int group = item.getEtcItem().getSharedReuseGroup(); final int group = item.getEtcItem().getSharedReuseGroup();
if (group >= 0) if (group >= 0)
player.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, (int)remainingTime, skill.getReuseDelay())); {
player.sendPacket(new ExUseSharedGroupItem(item.getItemId(), group, (int) remainingTime, skill.getReuseDelay()));
}
} }
} }
else else
...@@ -248,4 +279,4 @@ public class ItemSkillsTemplate implements IItemHandler ...@@ -248,4 +279,4 @@ public class ItemSkillsTemplate implements IItemHandler
} }
player.sendPacket(sm); player.sendPacket(sm);
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment