Addition of VIP system.

Contributed by marciox25.
This commit is contained in:
MobiusDevelopment
2021-04-30 16:29:22 +00:00
parent f7b82e35b9
commit 1acb57e53f
331 changed files with 16039 additions and 487 deletions

View File

@@ -13,6 +13,10 @@ EnableAttendanceRewards = False
# Default: False
PremiumOnlyAttendanceRewards = False
# Enable the Attendance Reward system only for Vip accounts.
# Default: False
VipOnlyAttendanceRewards = False
# Make rewards sharable in the same account.
# Default: False (Each character will receive its own rewards.)
AttendanceRewardsShareAccount = False

View File

@@ -9,6 +9,9 @@ PcCafeEnabled = False
# Allow only players with a Premium account.
PcCafeOnlyPremium = False
# Allow only players with a Vip Tier account.
PcCafeOnlyVip = False
# Max points that player may have.
# Limited by int limit.
MaxPcCafePoints = 200000

View File

@@ -0,0 +1,22 @@
# ---------------------------------------------------------------------------
# VIP System
# ---------------------------------------------------------------------------
# VIP System Enabled.
# l2.ini
# [VipSystem]
# UseVipInfoWndAden=false
# -> needs to be true
# Prime shop Aden needs to be true aswell!
# Check vip.xml for more info!
VipEnabled = False
# Max vip level that can be reached (Client Limitations, lv 8 -> 10 Doesn't exist. If u want to use, make it yourself!)
MaxVipLevel = 7
# When purchasing from the Prime Shop, the price amount will add to your vip points
PrimeAffectPoints = true
# When purchasing from the L Shop, the price amount will add to your vip points
# P.S. this will only affect the purchases made with L Coin and not Adena!
LShopAffectPoints = true

View File

@@ -18,7 +18,56 @@
<item id="2090028" cat="2" paymentType="0" price="600" recommended="2" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="93483" count="1" /> <!-- Growth Kit: L-Coins -->
</item>
<item id="2090027" cat="2" paymentType="0" price="999" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item id="2090027" cat="2" paymentType="0" price="999" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" >
<item itemId="93484" count="1" /> <!-- Grace Kit: L-Coins -->
</item>
<item id="2090044" cat="4" paymentType="0" price="30" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="71268" count="1" /> <!-- VIP Gain Scroll -->
</item>
<item id="2090045" cat="4" paymentType="0" price="60" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="71269" count="1" /> <!-- Good VIP Gain Scroll -->
</item>
<item id="2090046" cat="4" paymentType="0" price="50" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="71316" count="1" /> <!-- VIP Gain Scroll - 80 -->
</item>
<item id="2090047" cat="4" paymentType="0" price="100" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="71317" count="1" /> <!-- VIP Gain Scroll - 240 -->
</item>
<item id="2090048" cat="4" paymentType="0" price="333" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0">
<item itemId="71314" count="1" /> <!-- VIP Gain Scroll - 800 -->
</item>
<item id="2090049" cat="4" paymentType="0" price="999" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" >
<item itemId="71315" count="1" /> <!-- VIP Gain Scroll - 2400 -->
</item>
<item id="2090050" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="1">
<item itemId="71177" count="1" /> <!-- Daily Present - VIP 1 -->
</item>
<item id="2090051" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="2">
<item itemId="71178" count="1" /> <!-- Daily Present - VIP 2 -->
</item>
<item id="2090052" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="3">
<item itemId="71179" count="1" /> <!-- Daily Present - VIP 3 -->
</item>
<item id="2090053" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="4">
<item itemId="71180" count="1" /> <!-- Daily Present - VIP 4 -->
</item>
<item id="2090054" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="5">
<item itemId="71181" count="1" /> <!-- Daily Present - VIP 5 -->
</item>
<item id="2090055" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="6">
<item itemId="71182" count="1" /> <!-- Daily Present - VIP 6 -->
</item>
<item id="2090056" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="7">
<item itemId="71183" count="1" /> <!-- Daily Present - VIP 7 -->
</item>
<item id="2090057" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="8">
<item itemId="99027" count="1" /> <!-- Daily Present - VIP 8 -->
</item>
<item id="2090058" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="9">
<item itemId="99028" count="1" /> <!-- Daily Present - VIP 9 -->
</item>
<item id="2090059" cat="5" paymentType="0" price="0" recommended="4" startSale="315558000" endSale="2127452400" dayOfWeek="127" startHour="0" startMinute="0" stopHour="23" stopMinute="59" stock="-1" maxStock="-1" salePercent="0" minLevel="0" maxLevel="0" minBirthday="0" maxBirthday="0" restrictionDay="0" availableCount="0" isVipGift="true" vipTier="10">
<item itemId="99029" count="1" /> <!-- Daily Present - VIP 10 -->
</item>
</list>

View File

@@ -391,6 +391,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Untargetable", Untargetable::new);
EffectHandler.getInstance().registerHandler("VampiricAttack", VampiricAttack::new);
EffectHandler.getInstance().registerHandler("VampiricDefence", VampiricDefence::new);
EffectHandler.getInstance().registerHandler("VipUp", VipUp::new);
EffectHandler.getInstance().registerHandler("VitalityExpRate", VitalityExpRate::new);
EffectHandler.getInstance().registerHandler("VitalityPointsRate", VitalityPointsRate::new);
EffectHandler.getInstance().registerHandler("VitalityPointUp", VitalityPointUp::new);

View File

@@ -0,0 +1,60 @@
/*
* 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 handlers.effecthandlers;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
/**
* @author Gabriel Costa Souza
*/
public class VipUp extends AbstractEffect
{
private final long _amount;
public VipUp(StatSet params)
{
_amount = params.getLong("amount", 0L);
}
@Override
public boolean isInstant()
{
return true;
}
@Override
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
{
if (effected == null)
{
return;
}
final PlayerInstance player = effected.getActingPlayer();
if (player == null)
{
return;
}
player.updateVipPoints(_amount);
}
}

View File

@@ -740,84 +740,129 @@
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i00" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="2" />
<set name="extractableCountMax" val="2" />
<capsuled_items>
<item id="736" min="1" max="1" chance="100.00"/> <!-- Scroll of Escape -->
<item id="29651" min="3" max="3" chance="100.00"/> <!-- Healing Potion -->
</capsuled_items>
</item>
<item id="71178" name="Daily Present - VIP 2" type="EtcItem">
<!-- Double-click the item to receive 1 Scroll of Resurrection, 3 Healing Potions, 10 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i01" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="2" />
<set name="extractableCountMax" val="2" />
<capsuled_items>
<item id="737" min="1" max="1" chance="100.00"/> <!-- Scroll of Resurrection -->
<item id="29651" min="3" max="3" chance="100.00"/> <!-- Healing Potion -->
</capsuled_items>
</item>
<item id="71179" name="Daily Present - VIP 3" type="EtcItem">
<!-- Double-click the item to receive 1 Scroll of Escape, 1 Scroll of Resurrection, 5 Healing Potions, 15 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i02" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="736" min="1" max="1" chance="100.00"/> <!-- Scroll of Escape -->
<item id="737" min="1" max="1" chance="100.00"/> <!-- Scroll of Resurrection -->
<item id="29651" min="3" max="3" chance="100.00"/> <!-- Healing Potion -->
</capsuled_items>
</item>
<item id="71180" name="Daily Present - VIP 4" type="EtcItem">
<!-- Double-click the item to receive 1 Scroll of Escape, 1 Scroll of Resurrection, 3 Greater Healing Potions, 25 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i03" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="736" min="1" max="1" chance="100.00"/> <!-- Scroll of Escape -->
<item id="737" min="1" max="1" chance="100.00"/> <!-- Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="71181" name="Daily Present - VIP 5" type="EtcItem">
<!-- Double-click the item to receive 1 Blessed Scroll of Escape, 3 Greater Healing Potions, 40 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i04" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="2" />
<set name="extractableCountMax" val="2" />
<capsuled_items>
<item id="91689" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Escape -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="71182" name="Daily Present - VIP 6" type="EtcItem">
<!-- Double-click on the item to receive 1 Blessed Scroll of Resurrection, 3 Greater Healing Potions, 100 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i05" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="2" />
<set name="extractableCountMax" val="2" />
<capsuled_items>
<item id="3936" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="71183" name="Daily Present - VIP 7" type="EtcItem">
<!-- Double-click the item to receive 1 Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 Greater Healing Potions, 150 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i06" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="weight" val="10" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="91689" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Escape -->
<item id="3936" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="71184" name="Agathion Meliodas" additionalName="Lv. 1" type="Armor">
<!-- Activates the power of the Agathion Meliodas. Special abilities may be activated if the Agathion is summoned from the main slot. Can be enchanted up to +7 with the Seven Sins Agathion Growth Book. Cannot be exchanged, dropped, destroyed, or sold. Can be stored in a private warehouse. <Conditions for upgrade>. Enchant to +7 to upgrade to Agathion Meliodas Lv. 2. -->

View File

@@ -678,24 +678,36 @@
<item id="71268" name="VIP Gain Scroll" type="EtcItem">
<!-- Allows to regain 27 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="56096" level="1" /> <!-- VIP Gain Scroll -->
</skills>
</item>
<item id="71269" name="Good VIP Gain Scroll" type="EtcItem">
<!-- Allows to regain 273 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="56097" level="1" /> <!-- Good VIP Gain Scroll -->
</skills>
</item>
<item id="71270" name="Venir's Talisman Fragment" type="EtcItem">
<!-- Material used to upgrade Venir's Talisman. If upgrade fails, the talisman level value will drop to 1. Cannot be dropped. -->

View File

@@ -154,50 +154,70 @@
<item id="71314" name="VIP Gain Scroll - 800" type="EtcItem">
<!-- Allows to regain 800 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_depositable" val="false" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="59125" level="1" /> <!-- VIP Gain Scroll - 800 -->
</skills>
</item>
<item id="71315" name="VIP Gain Scroll - 2400" type="EtcItem">
<!-- Allows to regain 2400 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="59126" level="1" /> <!-- VIP Gain Scroll - 2400 -->
</skills>
</item>
<item id="71316" name="VIP Gain Scroll - 80" type="EtcItem">
<!-- Allows to regain 80 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_depositable" val="false" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="59127" level="1" /> <!-- VIP Gain Scroll - 80 -->
</skills>
</item>
<item id="71317" name="VIP Gain Scroll - 240" type="EtcItem">
<!-- Allows to regain 240 VIP Points when used. Cannot be exchanged, dropped or sold in a private store. Can be stored in a private warehouse. -->
<set name="icon" val="BranchIcon.Icon.g_bm_vip_potion_i00" />
<set name="default_action" val="SKILL_REDUCE_ON_SKILL_SUCCESS" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="material" val="PAPER" />
<set name="weight" val="5" />
<set name="is_tradable" val="false" />
<set name="is_depositable" val="false" />
<set name="immediate_effect" val="true" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="59128" level="1" /> <!-- VIP Gain Scroll - 240 -->
</skills>
</item>
<item id="71318" name="Transformation Sealbook: Part-time Seller" additionalName="Kat the Cat" type="EtcItem">
<!-- Sealbook for learning the skill of transforming yourself into Kat the Cat. -->

View File

@@ -9,4 +9,61 @@
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
</item>
<item id="99027" name="Daily Present - VIP 8" type="EtcItem">
<!-- Double-click the item to receive 1 Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 Greater Healing Potions, 150 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i06" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="91689" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Escape -->
<item id="3936" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="99028" name="Daily Present - VIP 9" type="EtcItem">
<!-- Double-click the item to receive 1 Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 Greater Healing Potions, 150 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i06" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="91689" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Escape -->
<item id="3936" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
<item id="99029" name="Daily Present - VIP 10" type="EtcItem">
<!-- Double-click the item to receive 1 Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 Greater Healing Potions, 150 VIP Coins. -->
<set name="icon" val="BranchIcon.Icon.etc_vip_present_i06" />
<set name="default_action" val="PEEL" />
<set name="immediate_effect" val="true" />
<set name="material" val="FISH" />
<set name="is_tradable" val="false" />
<set name="is_dropable" val="false" />
<set name="is_sellable" val="false" />
<set name="is_stackable" val="true" />
<set name="handler" val="ExtractableItems" />
<set name="extractableCountMin" val="3" />
<set name="extractableCountMax" val="3" />
<capsuled_items>
<item id="91689" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Escape -->
<item id="3936" min="1" max="1" chance="100.00"/> <!-- Blessed Scroll of Resurrection -->
<item id="29652" min="3" max="3" chance="100.00"/> <!-- Major Healing Potion -->
</capsuled_items>
</item>
</list>

View File

@@ -283,36 +283,467 @@
<!-- You can obtain a daily VIP chest Lv. 1. Acquired XP/ SP +3%, item drop rate +3%. -->
<icon>BranchIcon.Icon.g_skill_vip1</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>5</amount>
</effect>
<effect name="SpModify">
<amount>5</amount>
</effect>
<effect name="BonusDropRate">
<amount>50</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>1</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="55025" toLevel="1" name="VIP Lv. 2">
<!-- You can obtain a daily VIP chest Lv. 2. Acquired XP/ SP +7%, item drop rate +7%. You can use the world chat at any level (world chat messages +3). -->
<icon>BranchIcon.Icon.g_skill_vip2</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>10</amount>
</effect>
<effect name="SpModify">
<amount>10</amount>
</effect>
<effect name="BonusDropRate">
<amount>150</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>6</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="55026" toLevel="1" name="VIP Lv. 3">
<!-- You can obtain a daily VIP chest Lv. 3. Acquired XP/ SP +15%, item drop rate +15%, Death XP Penalty -10%. You can use the world chat at any level (world chat messages +3). -->
<icon>BranchIcon.Icon.g_skill_vip3</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>15</amount>
</effect>
<effect name="SpModify">
<amount>15</amount>
</effect>
<effect name="BonusDropRate">
<amount>200</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>6</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-10</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="55027" toLevel="1" name="VIP Lv. 4">
<!-- You can obtain a daily VIP chest Lv. 4. Acquired XP/ SP +25%, item drop rate +15%, Death XP Penalty -15%. You can use the world chat at any level (world chat messages +5). -->
<icon>BranchIcon.Icon.g_skill_vip4</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>25</amount>
</effect>
<effect name="SpModify">
<amount>25</amount>
</effect>
<effect name="BonusDropRate">
<amount>250</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>10</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-20</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>WIT</stat>
</effect>
</effects>
</skill>
<skill id="55028" toLevel="1" name="VIP Lv. 5">
<!-- You can obtain a daily VIP chest Lv. 5. Acquired XP/ SP +30%, item drop rate +30%, Death XP Penalty -20%. Increases PvE damage. You can use the world chat at any level (world chat messages +10). -->
<icon>BranchIcon.Icon.g_skill_vip5</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>30</amount>
</effect>
<effect name="SpModify">
<amount>30</amount>
</effect>
<effect name="BonusDropRate">
<amount>250</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>20</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-20</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>15</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>15</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>WIT</stat>
</effect>
</effects>
</skill>
<skill id="55029" toLevel="1" name="VIP Lv. 6">
<!-- You can obtain a daily VIP chest Lv. 6. Acquired XP/ SP +30%, item drop rate +30%, Death XP Penalty -20%. Increases PvE damage, STR/ DEX/ CON/ INT/ WIT/ MEN +2. You can use the world chat at any level (world chat messages +10). -->
<icon>BranchIcon.Icon.g_skill_vip6</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>35</amount>
</effect>
<effect name="SpModify">
<amount>35</amount>
</effect>
<effect name="BonusDropRate">
<amount>250</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>20</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-20</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>2.5</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>2.5</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>2.5</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>20</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>20</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>1</amount>
<stat>WIT</stat>
</effect>
</effects>
</skill>
<skill id="55030" toLevel="1" name="VIP Lv. 7">
<!-- You can obtain a daily VIP chest Lv. 7. Acquired XP/ SP +30%, item drop rate +30%, Death XP Penalty -20%. Increases PvP/ PvE damage, STR/ DEX/ CON/ INT/ WIT/ MEN +2. You can use the world chat at any level (world chat messages +10). -->
<icon>BranchIcon.Icon.g_skill_vip7</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>35</amount>
</effect>
<effect name="SpModify">
<amount>35</amount>
</effect>
<effect name="BonusDropRate">
<amount>250</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>40</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-20</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>30</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>30</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>WIT</stat>
</effect>
</effects>
</skill>
<skill id="55031" toLevel="1" name="Report Status">
<!-- You are under suspicion of using an illegal program. Your actions have been restricted. -->

View File

@@ -546,11 +546,21 @@
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>27</amount>
</effect>
</effects>
</skill>
<skill id="56097" toLevel="1" name="Good VIP Gain Scroll">
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>273</amount>
</effect>
</effects>
</skill>
<skill id="56098" toLevel="24" name="Venir's Talisman">
<!-- When equipped, CON +$s1. -->

View File

@@ -139,21 +139,41 @@
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>800</amount>
</effect>
</effects>
</skill>
<skill id="59126" toLevel="1" name="VIP Gain Scroll - 2400">
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>2400</amount>
</effect>
</effects>
</skill>
<skill id="59127" toLevel="1" name="VIP Gain Scroll - 80">
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>80</amount>
</effect>
</effects>
</skill>
<skill id="59128" toLevel="1" name="VIP Gain Scroll - 240">
<icon>BranchIcon.Icon.g_bm_vip_potion_i00</icon>
<operateType>A1</operateType>
<reuseDelay>1000</reuseDelay>
<effects>
<effect name="VipUp">
<amount>240</amount>
</effect>
</effects>
</skill>
<skill id="59129" toLevel="1" name="Transformation Sealbook: Kat the Cat">
<operateType>A1</operateType>

View File

@@ -241,20 +241,323 @@
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
</skill>
<skill id="59723" toLevel="1" name="">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<skill id="59723" toLevel="1" name="VIP Lv. 8">
<!-- TODO: Client side -->
<icon>BranchIcon.Icon.g_skill_vip8</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>35</amount>
</effect>
<effect name="SpModify">
<amount>35</amount>
</effect>
<effect name="BonusDropRate">
<amount>300</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>50</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-30</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>12</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>50</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>50</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>2</amount>
<stat>WIT</stat>
</effect>
<effect name="MaxHp">
<amount>100</amount>
<mode>DIFF</mode>
</effect>
<effect name="MaxMp">
<amount>100</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="59724" toLevel="1" name="">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<skill id="59724" toLevel="1" name="VIP Lv. 9">
<!-- TODO: Client side -->
<icon>BranchIcon.Icon.g_skill_vip9</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>40</amount>
</effect>
<effect name="SpModify">
<amount>40</amount>
</effect>
<effect name="BonusDropRate">
<amount>300</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>50</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-40</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>13</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>13</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>13</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>80</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>80</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>3</amount>
<stat>WIT</stat>
</effect>
<effect name="MaxHp">
<amount>200</amount>
<mode>DIFF</mode>
</effect>
<effect name="MaxMp">
<amount>200</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="59725" toLevel="1" name="">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<skill id="59725" toLevel="1" name="VIP Lv. 10">
<!-- TODO: Client side -->
<icon>BranchIcon.Icon.g_skill_vip10</icon>
<operateType>P</operateType>
<hitTime>500</hitTime>
<effects>
<effect name="ExpModify">
<amount>50</amount>
</effect>
<effect name="SpModify">
<amount>50</amount>
</effect>
<effect name="BonusDropRate">
<amount>300</amount>
<mode>PER</mode>
</effect>
<effect name="WorldChatPoints">
<amount>50</amount>
<mode>DIFF</mode>
</effect>
<effect name="ReduceDropPenalty">
<deathPenalty>-50</deathPenalty>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvePhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PveRaidPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalAttackDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>15</amount>
<mode>PER</mode>
</effect>
<effect name="PhysicalDefence">
<amount>100</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalDefence">
<amount>100</amount>
<mode>DIFF</mode>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>STR</stat>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>INT</stat>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>CON</stat>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>DEX</stat>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>MEN</stat>
</effect>
<effect name="StatUp">
<amount>4</amount>
<stat>WIT</stat>
</effect>
<effect name="MaxHp">
<amount>500</amount>
<mode>DIFF</mode>
</effect>
<effect name="MaxMp">
<amount>500</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="59726" toLevel="1" name="">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->

View File

@@ -0,0 +1,245 @@
<?xml version='1.0' encoding='utf-8'?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/vip.xsd">
<!--
tier: tier of the vip
points-requires: points required to get to that tier
points-lose: points player will lose after a while.
PS. Client data made for Sylph! Probably works on essence aswell!
l2.ini
[VipSystem]
UseVipInfoWndAden=false
-> needs to be true
L2 Store needs to be true aswell!
ItemIds: 71314, 71315, 71316, 71317, 71268, 71269
ItemName_ClassicAden-eu.dat
item_name_begin id=71314 name=[VIP Gain Scroll - 800] additionalname=[] description=[VIP Points +800.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71315 name=[VIP Gain Scroll - 2400] additionalname=[] description=[VIP Points +2400.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71316 name=[VIP Gain Scroll - 80] additionalname=[] description=[VIP Points +80.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71317 name=[VIP Gain Scroll - 240] additionalname=[] description=[VIP Points +240.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71268 name=[VIP Gain Scroll] additionalname=[] description=[VIP Points +27.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71269 name=[Good VIP Gain Scroll] additionalname=[] description=[VIP Points +273.] popup=-1 default_action=[action_skill_reduce_on_skill_success] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71177 name=[Daily Present - VIP 1] additionalname=[] description=[Double-click to obtain a Scroll of Escape and 3 HP Replenishing Potions.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71178 name=[Daily Present - VIP 2] additionalname=[] description=[Double-click to obtain a Scroll of Resurrection and 3 HP Replenishing Potions.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71179 name=[Daily Present - VIP 3] additionalname=[] description=[Double-click to obtain a Scroll of Escape, Scroll of Resurrection, 5 HP Replenishing Potions.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71180 name=[Daily Present - VIP 4] additionalname=[] description=[Double-click to obtain a Scroll of Escape, Scroll of Resurrection, 3 HP Replenishing Potions.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71181 name=[Daily Present - VIP 5] additionalname=[] description=[Double-click to obtain a Blessed Scroll of Escape, 3 High-grade HP Replenishing Potions, 40 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71182 name=[Daily Present - VIP 6] additionalname=[] description=[Double-click to obtain a Blessed Scroll of Resurrection, 3 High-grade HP Replenishing Potions, 100 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=71183 name=[Daily Present - VIP 7] additionalname=[] description=[Double-click to obtain a Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 High-grade HP Replenishing Potions, 150 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=99027 name=[Daily Present - VIP 8] additionalname=[] description=[CHANGE ME Double-click to obtain a Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 High-grade HP Replenishing Potions, 150 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=99028 name=[Daily Present - VIP 9] additionalname=[] description=[CHANGE ME Double-click to obtain a Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 High-grade HP Replenishing Potions, 150 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
item_name_begin id=99029 name=[Daily Present - VIP 10] additionalname=[] description=[CHANGE ME Double-click to obtain a Blessed Scroll of Escape, 1 Blessed Scroll of Resurrection, 3 High-grade HP Replenishing Potions, 150 VIP Coins.] popup=-1 default_action=[action_peel] use_order=99 name_class=-1 color=1 Tooltip_Texture=[None] is_trade=0 is_drop=0 is_destruct=1 is_private_store=0 keep_type=1 is_npctrade=0 is_commission_store=0 item_name_end
ItemName_ClassicAden-eu.dat [end]
item_ex_begin id=71314 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71315 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71316 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71317 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71268 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71269 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71177 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71178 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71179 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71180 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71181 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71182 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=71183 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=99027 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=99028 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
item_ex_begin id=99029 keep_type_selection=normal keep_type_enchant={0;0;0} item_ex_end
ProductName_ClassicAden-eu.dat
product_name_begin id=2090044 outer_name=[VIP Gain Scroll] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090045 outer_name=[Good VIP Gain Scroll] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090046 outer_name=[VIP Gain Scroll - 80] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090047 outer_name=[VIP Gain Scroll - 240] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090048 outer_name=[VIP Gain Scroll - 800] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090049 outer_name=[VIP Gain Scroll - 2400] description=[] icon=[BranchIcon.Icon.g_bm_vip_potion_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090050 outer_name=[Daily Present - VIP 1] description=[] icon=[BranchIcon.Icon.etc_vip_present_i00] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090051 outer_name=[Daily Present - VIP 2] description=[] icon=[BranchIcon.Icon.etc_vip_present_i01] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090052 outer_name=[Daily Present - VIP 3] description=[] icon=[BranchIcon.Icon.etc_vip_present_i02] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090053 outer_name=[Daily Present - VIP 4] description=[] icon=[BranchIcon.Icon.etc_vip_present_i03] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090054 outer_name=[Daily Present - VIP 5] description=[] icon=[BranchIcon.Icon.etc_vip_present_i04] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090055 outer_name=[Daily Present - VIP 6] description=[] icon=[BranchIcon.Icon.etc_vip_present_i05] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090056 outer_name=[Daily Present - VIP 7] description=[] icon=[BranchIcon.Icon.etc_vip_present_i06] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090057 outer_name=[Daily Present - VIP 8] description=[] icon=[BranchIcon.Icon.etc_vip_present_i08] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090058 outer_name=[Daily Present - VIP 9] description=[] icon=[BranchIcon.Icon.etc_vip_present_i09] icon_panel=[None] mainsubject=[] product_name_end
product_name_begin id=2090059 outer_name=[Daily Present - VIP 10] description=[] icon=[BranchIcon.Icon.etc_vip_present_i10] icon_panel=[None] mainsubject=[] product_name_end
EtcItemgrp_ClassicAden.dat
item_begin tag=2 object_id=71314 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71315 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[icon.panel_2] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71316 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71317 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[icon.panel_2] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71268 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71269 drop_type=0 drop_anim_type=3 drop_radius=6 drop_height=3 drop_texture={{[dropitems.drop_scroll_m00];{[dropitemstex.drop_scroll_t00]}}} icon={[BranchIcon.Icon.g_bm_vip_potion_i00];[None];[None];[None];[None]} durability=-1 weight=5 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[icon.panel_2] complete_item_dropsound_type=[None] inventory_type=consumable mesh={[None]} texture={[None]} drop_sound=[ItemSound.itemdrop_scroll] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=scroll crystal_type=crystal_free item_end
item_begin tag=2 object_id=71177 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i00];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71178 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i01];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71179 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i02];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71180 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i03];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71181 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i04];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71182 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i05];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=71183 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i06];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=99027 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i08];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=99028 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i09];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
item_begin tag=2 object_id=99029 drop_type=0 drop_anim_type=3 drop_radius=5 drop_height=6 drop_texture={{[None];{[None]}}} icon={[BranchIcon.Icon.etc_vip_present_i10];[None];[None];[None];[None]} durability=-1 weight=10 material_type=paper crystallizable=0 related_quest_id={} color=1 is_attribution=0 property_params=0 icon_panel=[None] complete_item_dropsound_type=[None] inventory_type=etc mesh={[None]} texture={[None]} drop_sound=[None] equip_sound=[None] consume_type=consume_type_stackable etcitem_type=none crystal_type=crystal_free item_end
Placeholders!!!! The skill exist and is edited. Only client side need to be done. But we cannot open skillgrp yet due missing grp enum.
SkillName_ClassicAden-eu.dat
skill_begin skill_id=59723 skill_level=1 skill_sublevel=0 name=[VIP Lv. 8] desc=[You can obtain a daily VIP chest Lv. 8. Acquired XP/ SP +35%%, item drop rate +300%%, Death XP Penalty -30%%. Increases PvP/ PvE damage, STR/ DEX/ CON/ INT/ WIT/ MEN +2. You can use the world chat at any level (world chat messages +50).] desc_param=[] enchant_name=[none] enchant_name_param=[] enchant_desc=[none] enchant_desc_param=[] skill_end
skill_begin skill_id=59724 skill_level=1 skill_sublevel=0 name=[VIP Lv. 9] desc=[You can obtain a daily VIP chest Lv. 9. Acquired XP/ SP +40%%, item drop rate +300%%, Death XP Penalty -40%%. Increases PvP/ PvE damage, STR/ DEX/ CON/ INT/ WIT/ MEN +3. You can use the world chat at any level (world chat messages +50).] desc_param=[] enchant_name=[none] enchant_name_param=[] enchant_desc=[none] enchant_desc_param=[] skill_end
skill_begin skill_id=59725 skill_level=1 skill_sublevel=0 name=[VIP Lv. 10] desc=[You can obtain a daily VIP chest Lv. 10. Acquired XP/ SP +50%%, item drop rate +300%%, Death XP Penalty -50%%. Increases PvP/ PvE damage, STR/ DEX/ CON/ INT/ WIT/ MEN +4. You can use the world chat at any level (world chat messages +50).] desc_param=[] enchant_name=[none] enchant_name_param=[] enchant_desc=[none] enchant_desc_param=[] skill_end
Skillgrp_ClassicAden.dat [Sylph]
skill_begin skill_id=59723 skill_level=1 skill_sublevel=0 icon_type=40 icon_hide=0 MagicType=default operate_type=2 mp_consume=0 cast_range=-1 cast_style=0 hit_time=0.0 cool_time=0.0 reuse_delay=0.0 effect_point=0 is_magic=0 origin_skill=0 is_double=0 animation={[None]} skill_visual_effect=[None] icon=[BranchIcon.Icon.g_skill_vip8] icon_panel=[None] debuff=0 resist_cast=0 enchant_skill_level=0 enchant_icon=[None] hp_consume=0 rumble_self=-1 rumble_target=-1 level_hide=0 dp_consume=0 energy_consume=0 dbdelete=0 abnormal_time=0 trait_type=None target_type=none affect_scope=none skill_end
skill_begin skill_id=59724 skill_level=1 skill_sublevel=0 icon_type=40 icon_hide=0 MagicType=default operate_type=2 mp_consume=0 cast_range=-1 cast_style=0 hit_time=0.0 cool_time=0.0 reuse_delay=0.0 effect_point=0 is_magic=0 origin_skill=0 is_double=0 animation={[None]} skill_visual_effect=[None] icon=[BranchIcon.Icon.g_skill_vip9] icon_panel=[None] debuff=0 resist_cast=0 enchant_skill_level=0 enchant_icon=[None] hp_consume=0 rumble_self=-1 rumble_target=-1 level_hide=0 dp_consume=0 energy_consume=0 dbdelete=0 abnormal_time=0 trait_type=None target_type=none affect_scope=none skill_end
skill_begin skill_id=59725 skill_level=1 skill_sublevel=0 icon_type=40 icon_hide=0 MagicType=default operate_type=2 mp_consume=0 cast_range=-1 cast_style=0 hit_time=0.0 cool_time=0.0 reuse_delay=0.0 effect_point=0 is_magic=0 origin_skill=0 is_double=0 animation={[None]} skill_visual_effect=[None] icon=[BranchIcon.Icon.g_skill_vip10] icon_panel=[None] debuff=0 resist_cast=0 enchant_skill_level=0 enchant_icon=[None] hp_consume=0 rumble_self=-1 rumble_target=-1 level_hide=0 dp_consume=0 energy_consume=0 dbdelete=0 abnormal_time=0 trait_type=None target_type=none affect_scope=none skill_end
-->
<vip tier="0" points-required="0" points-lose="0">
<bonus/>
</vip>
<vip tier="1" points-required="300" points-lose="300">
<bonus skill="55024"/>
</vip>
<vip tier="2" points-required="1000" points-lose="600">
<bonus skill="55025"/>
</vip>
<vip tier="3" points-required="2000" points-lose="660">
<bonus skill="55026"/>
</vip>
<vip tier="4" points-required="3500" points-lose="1320">
<bonus skill="55027"/>
</vip>
<vip tier="5" points-required="7000" points-lose="2640">
<bonus skill="55028"/>
</vip>
<vip tier="6" points-required="20000" points-lose="5280">
<bonus skill="55029"/>
</vip>
<vip tier="7" points-required="40000" points-lose="10560">
<bonus skill="55030"/>
</vip>
<vip tier="8" points-required="60000" points-lose="15740">
<bonus skill="59723"/>
</vip>
<vip tier="9" points-required="80000" points-lose="21120">
<bonus skill="59724"/>
</vip>
<vip tier="10" points-required="120000" points-lose="31680">
<bonus skill="59725"/>
</vip>
</list>
<!--
<file pattern="kor_prelude_of_war_p10" isSafePackage="true">
<node name="data" reader="UINT" />
<for name="skill" size="#data" hidden="false">
<node name="skill_id" reader="UINT" />
<node name="skill_level" reader="UCHAR" />
<node name="skill_sublevel" reader="SHORT" />
<node name="icon_type" reader="UCHAR" />
<node name="icon_hide" reader="UCHAR" />
<node name="MagicType" reader="UCHAR" enumName="skill_magic_type" />
<node name="operate_type" reader="UCHAR" />
<node name="mp_consume" reader="SHORT" />
<node name="cast_range" reader="UINT" />
<node name="cast_style" reader="UCHAR" />
<node name="hit_time" reader="FLOAT" />
<node name="cool_time" reader="FLOAT" />
<node name="reuse_delay" reader="FLOAT" />
<node name="effect_point" reader="UINT" />
<node name="is_magic" reader="UCHAR" />
<node name="origin_skill" reader="UINT" />
<node name="is_double" reader="UCHAR" />
<node name="animation" reader="UINT" />
<for name="animation" size="#animation">
<node name="param_animation" reader="MAP_INT" />
</for>
<node name="skill_visual_effect" reader="MAP_INT" />
<node name="icon" reader="MAP_INT" />
<node name="icon_panel" reader="MAP_INT" />
<node name="debuff" reader="UCHAR" />
<node name="resist_cast" reader="UCHAR" />
<node name="enchant_skill_level" reader="UCHAR" />
<node name="enchant_icon" reader="MAP_INT" />
<node name="hp_consume" reader="SHORT" />
<node name="rumble_self" reader="UCHAR" />
<node name="rumble_target" reader="UCHAR" />
<node name="level_hide" reader="UCHAR" />
<node name="dp_consume" reader="UCHAR" />
<node name="energy_consume" reader="UCHAR" />
<node name="dbdelete" reader="INT" />
<node name="abnormal_time" reader="UINT" />
<node name="trait_type" reader="UCHAR" enumName="trait_type" />
<node name="target_type" reader="UCHAR" enumName="target_type" />
<node name="affect_scope" reader="UCHAR" enumName="affect_scope" />
</for>
<node name="data2" reader="CNTR" />
<for name="skill_macro" size="#data2" hidden="false">
<node name="skill_id" reader="UINT" />
<node name="automatic_use" reader="UCHAR" />
</for>
<node name="data3" reader="CNTR" />
<for name="skill_ex_icon" size="#data3" hidden="false">
<node name="skill_id" reader="UINT" />
<node name="skill_level" reader="UCHAR" />
<node name="skill_sublevel" reader="SHORT" />
<node name="icon_panel2" reader="MAP_INT" />
</for>
</file>
<enum name="trait_type">
<node index="0" name="None" />
</enum>
<enum name="target_type">
<node index="0" name="none" />
<node index="1" name="self" />
<node index="2" name="target" />
<node index="3" name="targetself" />
<node index="4" name="enemy" />
<node index="5" name="enemyonly" />
<node index="6" name="enemynot" />
<node index="7" name="summon" />
</enum>
<enum name="affect_scope">
<node index="0" name="none" />
<node index="1" name="single" />
<node index="2" name="range" />
<node index="3" name="fan" />
<node index="4" name="pointblank" />
<node index="5" name="party" />
<node index="6" name="square" />
<node index="7" name="pledge" />
<node index="8" name="rangesortbyhp" />
<node index="9" name="rangesortbydist" />
</enum>
-->

View File

@@ -34,6 +34,8 @@
<xs:attribute type="xs:byte" name="maxBirthday" use="optional" />
<xs:attribute type="xs:byte" name="restrictionDay" use="optional" />
<xs:attribute type="xs:byte" name="availableCount" use="optional" />
<xs:attribute type="xs:boolean" name="isVipGift" use="optional" />
<xs:attribute type="xs:byte" name="vipTier" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="vip" type="TierInfo" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="TierInfo">
<xs:sequence>
<xs:element name="bonus" type="TierBonusInfo"/>
</xs:sequence>
<xs:attribute name="tier" type="xs:byte" use="required"/>
<xs:attribute name="points-required" type="xs:long" use="required"/>
<xs:attribute name="points-lose" type="xs:long" use="required"/>
</xs:complexType>
<xs:complexType name="TierBonusInfo">
<xs:attribute name="skill" type="xs:int" default="0"/>
</xs:complexType>
</xs:schema>

View File

@@ -134,6 +134,7 @@ public class Config
private static final String CUSTOM_OFFLINE_TRADE_CONFIG_FILE = "./config/Custom/OfflineTrade.ini";
private static final String CUSTOM_PASSWORD_CHANGE_CONFIG_FILE = "./config/Custom/PasswordChange.ini";
private static final String CUSTOM_PC_CAFE_CONFIG_FILE = "./config/Custom/PcCafe.ini";
private static final String CUSTOM_VIP_CONFIG_FILE = "./config/Custom/VipSystem.ini";
private static final String CUSTOM_PREMIUM_SYSTEM_CONFIG_FILE = "./config/Custom/PremiumSystem.ini";
private static final String CUSTOM_PRIVATE_STORE_RANGE_CONFIG_FILE = "./config/Custom/PrivateStoreRange.ini";
private static final String CUSTOM_PVP_ANNOUNCE_CONFIG_FILE = "./config/Custom/PvpAnnounce.ini";
@@ -156,6 +157,7 @@ public class Config
public static boolean ENABLE_ATTENDANCE_REWARDS;
public static boolean PREMIUM_ONLY_ATTENDANCE_REWARDS;
public static boolean VIP_ONLY_ATTENDANCE_REWARDS;
public static boolean ATTENDANCE_REWARDS_SHARE_ACCOUNT;
public static int ATTENDANCE_REWARD_DELAY;
public static boolean ATTENDANCE_POPUP_START;
@@ -1261,6 +1263,7 @@ public class Config
public static boolean PREMIUM_ONLY_FISHING;
public static boolean PC_CAFE_ENABLED;
public static boolean PC_CAFE_ONLY_PREMIUM;
public static boolean PC_CAFE_ONLY_VIP;
public static int PC_CAFE_MAX_POINTS;
public static boolean PC_CAFE_ENABLE_DOUBLE_POINTS;
public static int PC_CAFE_DOUBLE_POINTS_CHANCE;
@@ -1268,6 +1271,10 @@ public class Config
public static boolean PC_CAFE_RANDOM_POINT;
public static boolean PC_CAFE_REWARD_LOW_EXP_KILLS;
public static int PC_CAFE_LOW_EXP_KILLS_CHANCE;
public static boolean VIP_SYSTEM_ENABLED;
public static boolean VIP_SYSTEM_PRIME_AFFECT;
public static boolean VIP_SYSTEM_L_SHOP_AFFECT;
public static int VIP_SYSTEM_MAX_TIER;
public static boolean SELLBUFF_ENABLED;
public static int SELLBUFF_MP_MULTIPLER;
public static int SELLBUFF_PAYMENT_ID;
@@ -1555,6 +1562,7 @@ public class Config
final PropertiesParser Attandance = new PropertiesParser(ATTENDANCE_CONFIG_FILE);
ENABLE_ATTENDANCE_REWARDS = Attandance.getBoolean("EnableAttendanceRewards", false);
PREMIUM_ONLY_ATTENDANCE_REWARDS = Attandance.getBoolean("PremiumOnlyAttendanceRewards", false);
VIP_ONLY_ATTENDANCE_REWARDS = Attandance.getBoolean("VipOnlyAttendanceRewards", false);
ATTENDANCE_REWARDS_SHARE_ACCOUNT = Attandance.getBoolean("AttendanceRewardsShareAccount", false);
ATTENDANCE_REWARD_DELAY = Attandance.getInt("AttendanceRewardDelay", 30);
ATTENDANCE_POPUP_START = Attandance.getBoolean("AttendancePopupStart", true);
@@ -3259,6 +3267,7 @@ public class Config
final PropertiesParser PcCafe = new PropertiesParser(CUSTOM_PC_CAFE_CONFIG_FILE);
PC_CAFE_ENABLED = PcCafe.getBoolean("PcCafeEnabled", false);
PC_CAFE_ONLY_PREMIUM = PcCafe.getBoolean("PcCafeOnlyPremium", false);
PC_CAFE_ONLY_VIP = PcCafe.getBoolean("PcCafeOnlyVip", false);
PC_CAFE_MAX_POINTS = PcCafe.getInt("MaxPcCafePoints", 200000);
if (PC_CAFE_MAX_POINTS < 0)
{
@@ -3287,6 +3296,19 @@ public class Config
PC_CAFE_LOW_EXP_KILLS_CHANCE = 100;
}
final PropertiesParser vipSystem = new PropertiesParser(CUSTOM_VIP_CONFIG_FILE);
VIP_SYSTEM_ENABLED = vipSystem.getBoolean("VipEnabled", false);
if (VIP_SYSTEM_ENABLED)
{
VIP_SYSTEM_PRIME_AFFECT = vipSystem.getBoolean("PrimeAffectPoints", false);
VIP_SYSTEM_L_SHOP_AFFECT = vipSystem.getBoolean("LShopAffectPoints", false);
VIP_SYSTEM_MAX_TIER = vipSystem.getInt("MaxVipLevel", 7);
if (VIP_SYSTEM_MAX_TIER > 10)
{
VIP_SYSTEM_MAX_TIER = 10;
}
}
// Load PremiumSystem config file (if exists)
final PropertiesParser PremiumSystem = new PropertiesParser(CUSTOM_PREMIUM_SYSTEM_CONFIG_FILE);
PREMIUM_SYSTEM_ENABLED = PremiumSystem.getBoolean("EnablePremiumSystem", false);

View File

@@ -111,6 +111,7 @@ import org.l2jmobius.gameserver.data.xml.TeleporterData;
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.data.xml.VipData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler;
@@ -158,6 +159,7 @@ import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.olympiad.Hero;
import org.l2jmobius.gameserver.model.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.vip.VipManager;
import org.l2jmobius.gameserver.model.votereward.VoteSystem;
import org.l2jmobius.gameserver.network.ClientNetworkManager;
import org.l2jmobius.gameserver.network.NpcStringId;
@@ -293,6 +295,7 @@ public class GameServer
AttendanceRewardData.getInstance();
MagicLampData.getInstance();
RandomCraftData.getInstance();
VipData.getInstance();
printSection("Characters");
ClassListData.getInstance();
@@ -310,6 +313,7 @@ public class GameServer
CharSummonTable.getInstance().init();
BeautyShopData.getInstance();
MentorManager.getInstance();
VipManager.getInstance();
if (Config.FACTION_SYSTEM_ENABLED)
{

View File

@@ -0,0 +1,152 @@
/*
* 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 org.l2jmobius.gameserver.data.xml;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.model.vip.VipInfo;
/**
* @author Gabriel Costa Souza
*/
public class VipData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(VipData.class.getName());
private final Map<Byte, VipInfo> _vipTiers = new HashMap<>();
protected VipData()
{
load();
}
@Override
public void load()
{
if (!Config.VIP_SYSTEM_ENABLED)
{
return;
}
_vipTiers.clear();
parseDatapackFile("data/vip.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _vipTiers.size() + " vips.");
}
@Override
public void parseDocument(Document doc, File f)
{
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("list".equalsIgnoreCase(n.getNodeName()))
{
VIP_FILE: for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
if ("vip".equalsIgnoreCase(d.getNodeName()))
{
final NamedNodeMap attrs = d.getAttributes();
Node att;
byte tier = -1;
int required = -1;
int lose = -1;
att = attrs.getNamedItem("tier");
if (att == null)
{
LOGGER.severe(getClass().getSimpleName() + ": Missing tier for vip, skipping");
continue;
}
tier = Byte.parseByte(att.getNodeValue());
att = attrs.getNamedItem("points-required");
if (att == null)
{
LOGGER.severe(getClass().getSimpleName() + ": Missing points-required for vip: " + tier + ", skipping");
continue;
}
required = Integer.parseInt(att.getNodeValue());
att = attrs.getNamedItem("points-lose");
if (att == null)
{
LOGGER.severe(getClass().getSimpleName() + ": Missing points-lose for vip: " + tier + ", skipping");
continue;
}
lose = Integer.parseInt(att.getNodeValue());
final VipInfo vipInfo = new VipInfo(tier, required, lose);
for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
{
if ("bonus".equalsIgnoreCase(c.getNodeName()))
{
final int skill = Integer.parseInt(c.getAttributes().getNamedItem("skill").getNodeValue());
try
{
vipInfo.setSkill(skill);
}
catch (Exception e)
{
LOGGER.severe(getClass().getSimpleName() + ": Error in bonus parameter for vip: " + tier + ", skipping");
continue VIP_FILE;
}
}
}
_vipTiers.put(tier, vipInfo);
}
}
}
}
}
/**
* Gets the single instance of VipData.
* @return single instance of VipData
*/
public static VipData getInstance()
{
return SingletonHolder.INSTANCE;
}
/**
* The Class SingletonHolder.
*/
private static class SingletonHolder
{
protected static final VipData INSTANCE = new VipData();
}
public int getSkillId(byte tier)
{
return _vipTiers.get(tier).getSkill();
}
public Map<Byte, VipInfo> getVipTiers()
{
return _vipTiers;
}
}

View File

@@ -43,7 +43,9 @@ import org.l2jmobius.gameserver.model.eventengine.ScheduleTarget;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
import org.l2jmobius.gameserver.model.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.model.vip.VipManager;
import org.l2jmobius.gameserver.network.serverpackets.ExVoteSystemInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExWorldChatCnt;
@@ -73,6 +75,7 @@ public class DailyTaskManager extends AbstractEventManager<AbstractEvent<?>>
resetWorldChatPoints();
resetTrainingCamp();
resetVitality();
resetVip();
}
@ScheduleTarget
@@ -324,6 +327,24 @@ public class DailyTaskManager extends AbstractEventManager<AbstractEvent<?>>
}
}
private void resetVip()
{
// Delete all entries for received gifts
AccountVariables.deleteVipPurchases(AccountVariables.VIP_ITEM_BOUGHT);
// Checks the tier expiration for online players
// offline players get handled on next time they log in.
for (PlayerInstance player : World.getInstance().getPlayers())
{
if (player.getVipTier() > 0)
{
VipManager.getInstance().checkVipTierExpiration(player);
}
player.getAccountVariables().restoreMe();
}
}
private void resetDailyMissionRewards()
{
DailyMissionData.getInstance().getDailyMissionData().forEach(DailyMissionDataHolder::reset);

View File

@@ -39,6 +39,11 @@ public class PcCafePointsManager
return;
}
if (Config.PC_CAFE_ONLY_VIP && (player.getVipTier() <= 0))
{
return;
}
if (player.getPcCafePoints() >= Config.PC_CAFE_MAX_POINTS)
{
final SystemMessage message = new SystemMessage(SystemMessageId.YOU_HAVE_EARNED_THE_MAXIMUM_NUMBER_OF_PA_POINTS);

View File

@@ -21,6 +21,8 @@ import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -206,6 +208,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerFameCh
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerHennaAdd;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerHennaRemove;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemEquip;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLoad;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeStatus;
@@ -283,6 +286,7 @@ import org.l2jmobius.gameserver.model.stats.MoveType;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.model.vip.VipManager;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
@@ -363,6 +367,7 @@ import org.l2jmobius.gameserver.network.serverpackets.autoplay.ExAutoPlaySetting
import org.l2jmobius.gameserver.network.serverpackets.commission.ExResponseCommissionInfo;
import org.l2jmobius.gameserver.network.serverpackets.friend.FriendStatus;
import org.l2jmobius.gameserver.network.serverpackets.limitshop.ExBloodyCoinCount;
import org.l2jmobius.gameserver.network.serverpackets.vip.ReceiveVipInfo;
import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
import org.l2jmobius.gameserver.taskmanager.AutoPlayTaskManager;
import org.l2jmobius.gameserver.taskmanager.AutoUseTaskManager;
@@ -885,6 +890,8 @@ public class PlayerInstance extends Playable
private ElementalSpirit[] _spirits;
private ElementalType _activeElementalSpiritType;
private byte _vipTier = 0;
private final AutoPlaySettingsHolder _autoPlaySettings = new AutoPlaySettingsHolder();
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
@@ -6677,6 +6684,7 @@ public class PlayerInstance extends Playable
}
}
}
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerLoad(player), player);
}
}
@@ -6780,6 +6788,7 @@ public class PlayerInstance extends Playable
player.setOnlineStatus(true, false);
PlayerAutoSaveTaskManager.getInstance().add(player);
}
catch (Exception e)
{
@@ -10077,6 +10086,7 @@ public class PlayerInstance extends Playable
}
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerLogin(this), this);
if (isMentee())
{
// Notify to scripts
@@ -14261,6 +14271,57 @@ public class PlayerInstance extends Playable
}
}
public byte getVipTier()
{
return _vipTier;
}
public void setVipTier(byte vipTier)
{
_vipTier = vipTier;
}
public long getVipPoints()
{
return getAccountVariables().getLong(AccountVariables.VIP_POINTS, 0L);
}
public long getVipTierExpiration()
{
return getAccountVariables().getLong(AccountVariables.VIP_EXPIRATION, 0L);
}
public void setVipTierExpiration(long expiration)
{
getAccountVariables().set(AccountVariables.VIP_EXPIRATION, expiration);
}
public void updateVipPoints(long points)
{
if (points == 0)
{
return;
}
final int currentVipTier = VipManager.getInstance().getVipTier(getVipPoints());
getAccountVariables().set(AccountVariables.VIP_POINTS, getVipPoints() + points);
final byte newTier = VipManager.getInstance().getVipTier(getVipPoints());
if (newTier != currentVipTier)
{
_vipTier = newTier;
if (newTier > 0)
{
getAccountVariables().set(AccountVariables.VIP_EXPIRATION, Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli());
VipManager.getInstance().manageTier(this);
}
else
{
getAccountVariables().set(AccountVariables.VIP_EXPIRATION, 0L);
}
}
getAccountVariables().storeMe(); // force to store to prevent falty purchases after a crash.
sendPacket(new ReceiveVipInfo(this));
}
public void initElementalSpirits()
{
tryLoadSpirits();

View File

@@ -90,6 +90,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemPi
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemTransfer;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLevelChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLoad;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogout;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeAdd;
@@ -259,6 +260,7 @@ public enum EventType
ON_PLAYER_LEVEL_CHANGED(OnPlayerLevelChanged.class, void.class),
ON_PLAYER_LOGIN(OnPlayerLogin.class, void.class),
ON_PLAYER_LOGOUT(OnPlayerLogout.class, void.class),
ON_PLAYER_LOAD(OnPlayerLoad.class, void.class),
ON_PLAYER_PK_CHANGED(OnPlayerPKChanged.class, void.class),
ON_PLAYER_PRESS_TUTORIAL_MARK(OnPlayerPressTutorialMark.class, void.class),
ON_PLAYER_MOVE_REQUEST(OnPlayerMoveRequest.class, void.class, TerminateReturn.class),

View File

@@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author Gabriel Costa Souza
*/
public class OnPlayerLoad implements IBaseEvent
{
private final PlayerInstance _player;
public OnPlayerLoad(PlayerInstance player)
{
_player = player;
}
public PlayerInstance getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_LOAD;
}
}

View File

@@ -47,6 +47,8 @@ public class PrimeShopGroup
private final int _maxBirthday;
private final int _restrictionDay;
private final int _availableCount;
private final boolean _isVipGift;
private final int _vipTier;
private final List<PrimeShopItem> _items;
public PrimeShopGroup(StatSet set, List<PrimeShopItem> items)
@@ -73,6 +75,9 @@ public class PrimeShopGroup
_maxBirthday = set.getInt("maxBirthday", 0);
_restrictionDay = set.getInt("restrictionDay", 0);
_availableCount = set.getInt("availableCount", 0);
_isVipGift = set.getBoolean("isVipGift", false);
_vipTier = set.getInt("vipTier", 0);
_items = items;
}
@@ -196,6 +201,16 @@ public class PrimeShopGroup
return _availableCount;
}
public boolean isVipGift()
{
return _isVipGift;
}
public int getVipTier()
{
return _vipTier;
}
public List<PrimeShopItem> getItems()
{
return _items;

View File

@@ -37,12 +37,17 @@ public class AccountVariables extends AbstractVariables
private static final String SELECT_QUERY = "SELECT * FROM account_gsdata WHERE account_name = ?";
private static final String DELETE_QUERY = "DELETE FROM account_gsdata WHERE account_name = ?";
private static final String INSERT_QUERY = "INSERT INTO account_gsdata (account_name, var, value) VALUES (?, ?, ?)";
private static final String DELETE_QUERY_VAR = "DELETE FROM account_gsdata where var = ?";
// Public variable names
public static final String HWID = "HWID";
public static final String HWIDSLIT_VAR = " ";
public static final String LCOIN_SHOP_PRODUCT_TIME = "LCSTime";
public static final String LCOIN_SHOP_PRODUCT_COUNT = "LCSCount";
public static final String VIP_POINTS = "VipPoints";
public static final String VIP_TIER = "VipTier";
public static final String VIP_EXPIRATION = "VipExpiration";
public static final String VIP_ITEM_BOUGHT = "Vip_Item_Bought";
private final String _accountName;
@@ -145,4 +150,28 @@ public class AccountVariables extends AbstractVariables
}
return true;
}
/**
* Delete all entries for an requested var
* @param var
* @return success
*/
public static boolean deleteVipPurchases(String var)
{
try (Connection con = DatabaseFactory.getConnection())
{
// Clear previous entries.
try (PreparedStatement st = con.prepareStatement(DELETE_QUERY_VAR))
{
st.setString(1, var);
st.execute();
}
}
catch (Exception e)
{
LOGGER.log(Level.WARNING, "AccountVariables: Couldn't delete vip variables!", e);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,60 @@
/*
* 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 org.l2jmobius.gameserver.model.vip;
/**
* @author Gabriel Costa Souza
*/
public class VipInfo
{
private final byte _tier;
private final long _pointsRequired;
private final long _pointsDepreciated;
private int _skill;
public VipInfo(byte tier, long pointsRequired, long pointsDepreciated)
{
_tier = tier;
_pointsRequired = pointsRequired;
_pointsDepreciated = pointsDepreciated;
}
public byte getTier()
{
return _tier;
}
public long getPointsRequired()
{
return _pointsRequired;
}
public long getPointsDepreciated()
{
return _pointsDepreciated;
}
public int getSkill()
{
return _skill;
}
public void setSkill(int skill)
{
_skill = skill;
}
}

View File

@@ -0,0 +1,202 @@
/*
* 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 org.l2jmobius.gameserver.model.vip;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.function.Consumer;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.VipData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLoad;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.network.serverpackets.ExBRNewIconCashBtnWnd;
import org.l2jmobius.gameserver.network.serverpackets.vip.ReceiveVipInfo;
/**
* @author Gabriel Costa Souza
*/
public final class VipManager
{
private static final byte VIP_MAX_TIER = (byte) Config.VIP_SYSTEM_MAX_TIER;
private final ConsumerEventListener _vipLoginListener = new ConsumerEventListener(null, EventType.ON_PLAYER_LOGIN, (Consumer<OnPlayerLogin>) this::onVipLogin, this);
private VipManager()
{
if (!Config.VIP_SYSTEM_ENABLED)
{
return;
}
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_LOAD, (Consumer<OnPlayerLoad>) this::onPlayerLoaded, this));
}
private void onPlayerLoaded(OnPlayerLoad event)
{
final PlayerInstance player = event.getPlayer();
player.setVipTier(getVipTier(player));
if (player.getVipTier() > 0)
{
manageTier(player);
player.addListener(_vipLoginListener);
}
else
{
player.sendPacket(new ReceiveVipInfo(player));
player.sendPacket(new ExBRNewIconCashBtnWnd((byte) 0));
}
}
private boolean canReceiveGift(PlayerInstance player)
{
if (!Config.VIP_SYSTEM_ENABLED)
{
return false;
}
if (player.getVipTier() <= 0)
{
return false;
}
return player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0) <= 0;
}
private void onVipLogin(OnPlayerLogin event)
{
final PlayerInstance player = event.getPlayer();
if (canReceiveGift(player))
{
player.sendPacket(new ExBRNewIconCashBtnWnd((byte) 1));
}
else
{
player.sendPacket(new ExBRNewIconCashBtnWnd((byte) 0));
}
player.removeListener(_vipLoginListener);
player.sendPacket(new ReceiveVipInfo(player));
}
public void manageTier(PlayerInstance player)
{
if (!checkVipTierExpiration(player))
{
player.sendPacket(new ReceiveVipInfo(player));
}
if (player.getVipTier() > 1)
{
final int oldSkillId = VipData.getInstance().getSkillId((byte) (player.getVipTier() - 1));
if (oldSkillId > 0)
{
final Skill oldSkill = SkillData.getInstance().getSkill(oldSkillId, 1);
if (oldSkill != null)
{
player.removeSkill(oldSkill);
}
}
}
final int skillId = VipData.getInstance().getSkillId(player.getVipTier());
if (skillId > 0)
{
final Skill skill = SkillData.getInstance().getSkill(skillId, 1);
if (skill != null)
{
player.addSkill(skill);
}
}
}
public byte getVipTier(PlayerInstance player)
{
return getVipInfo(player).getTier();
}
public byte getVipTier(long points)
{
byte temp = getVipInfo(points).getTier();
if (temp > VIP_MAX_TIER)
{
temp = VIP_MAX_TIER;
}
return temp;
}
private VipInfo getVipInfo(PlayerInstance player)
{
return getVipInfo(player.getVipPoints());
}
private VipInfo getVipInfo(long points)
{
for (byte i = 0; i < VipData.getInstance().getVipTiers().size(); i++)
{
if (points < VipData.getInstance().getVipTiers().get(i).getPointsRequired())
{
byte temp = (byte) (i - 1);
if (temp > VIP_MAX_TIER)
{
temp = VIP_MAX_TIER;
}
return VipData.getInstance().getVipTiers().get(temp);
}
}
return VipData.getInstance().getVipTiers().get(VIP_MAX_TIER);
}
public long getPointsDepreciatedOnLevel(byte vipTier)
{
return VipData.getInstance().getVipTiers().get(vipTier).getPointsDepreciated();
}
public long getPointsToLevel(byte level)
{
if (VipData.getInstance().getVipTiers().containsKey(level))
{
return VipData.getInstance().getVipTiers().get(level).getPointsRequired();
}
return 0;
}
public boolean checkVipTierExpiration(PlayerInstance player)
{
final Instant now = Instant.now();
if (now.isAfter(Instant.ofEpochMilli(player.getVipTierExpiration())))
{
player.updateVipPoints(-getPointsDepreciatedOnLevel(player.getVipTier()));
player.setVipTierExpiration(Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli());
return true;
}
return false;
}
public static VipManager getInstance()
{
return Singleton.INSTANCE;
}
private static class Singleton
{
private static final VipManager INSTANCE = new VipManager();
}
}

View File

@@ -131,6 +131,8 @@ import org.l2jmobius.gameserver.network.clientpackets.teleports.ExRequestTelepor
import org.l2jmobius.gameserver.network.clientpackets.teleports.ExTeleportToRaidPosition;
import org.l2jmobius.gameserver.network.clientpackets.teleports.RequestRaidTeleportInfo;
import org.l2jmobius.gameserver.network.clientpackets.training.NotifyTrainingRoomEnd;
import org.l2jmobius.gameserver.network.clientpackets.vip.ExRequestVipInfo;
import org.l2jmobius.gameserver.network.clientpackets.vip.RequestVipLuckGameInfo;
/**
* @author Sdw
@@ -402,10 +404,10 @@ public enum ExIncomingPackets implements IIncomingPackets<GameClient>
REQUEST_ITEM_ENSOUL(0x107, RequestItemEnsoul::new, ConnectionState.IN_GAME),
REQUEST_CASTLE_WAR_SEASON_REWARD(0x108, null, ConnectionState.IN_GAME),
REQUEST_VIP_PRODUCT_LIST(0x109, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_INFO(0x10A, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_INFO(0x10A, RequestVipLuckGameInfo::new, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_ITEM_LIST(0x10B, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_BONUS(0x10C, null, ConnectionState.IN_GAME),
EX_REQUEST_VIP_INFO(0x10D, null, ConnectionState.IN_GAME),
EX_REQUEST_VIP_INFO(0x10D, ExRequestVipInfo::new, ConnectionState.IN_GAME),
REQUEST_CAPTCHA_ANSWER(0x10E, null, ConnectionState.IN_GAME),
REQUEST_REFRESH_CAPTCHA_IMAGE(0x10F, null, ConnectionState.IN_GAME),
REQUEST_PLEDGE_SIGN_IN_FOR_OPEN_JOINING_METHOD(0x110, RequestPledgeSignInForOpenJoiningMethod::new, ConnectionState.IN_GAME),

View File

@@ -61,6 +61,11 @@ public class RequestVipAttendanceCheck implements IClientIncomingPacket
player.sendPacket(SystemMessageId.YOUR_VIP_RANK_IS_TOO_LOW_TO_RECEIVE_THE_REWARD);
return;
}
else if (Config.VIP_ONLY_ATTENDANCE_REWARDS && (player.getVipTier() <= 0))
{
player.sendPacket(SystemMessageId.YOUR_VIP_RANK_IS_TOO_LOW_TO_RECEIVE_THE_REWARD);
return;
}
// Check login delay.
if (player.getUptime() < (Config.ATTENDANCE_REWARD_DELAY * 60 * 1000))

View File

@@ -19,6 +19,7 @@ package org.l2jmobius.gameserver.network.clientpackets.limitshop;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
import org.l2jmobius.commons.util.Rnd;
@@ -193,6 +194,10 @@ public class RequestPurchaseLimitShopItemBuy implements IClientIncomingPacket
{
player.destroyItemByItemId("LCoinShop", _product.getIngredientIds()[i], _product.getIngredientQuantities()[i] * _amount, player, true);
}
if (Config.VIP_SYSTEM_L_SHOP_AFFECT)
{
player.updateVipPoints(_amount);
}
}
// Reward.

View File

@@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.model.actor.request.PrimeShopRequest;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.primeshop.PrimeShopGroup;
import org.l2jmobius.gameserver.model.primeshop.PrimeShopItem;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.primeshop.ExBRBuyProduct;
@@ -98,13 +99,20 @@ public class RequestBRBuyProduct implements IClientIncomingPacket
return;
}
player.setPrimePoints(player.getPrimePoints() - price);
if (Config.VIP_SYSTEM_PRIME_AFFECT)
{
player.updateVipPoints(price);
}
}
for (PrimeShopItem subItem : item.getItems())
{
player.addItem("PrimeShop", subItem.getId(), subItem.getCount() * _count, player, true);
}
if (item.isVipGift())
{
player.getAccountVariables().set(AccountVariables.VIP_ITEM_BOUGHT, Calendar.getInstance().getTimeInMillis());
}
player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS));
player.sendPacket(new ExBRGamePoint(player));
}
@@ -169,6 +177,12 @@ public class RequestBRBuyProduct implements IClientIncomingPacket
return false;
}
if ((item.getVipTier() > player.getVipTier()) || (item.isVipGift() && !canReceiveGift(player, item)))
{
player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SOLD_OUT));
return false;
}
final int weight = item.getWeight() * count;
final long slots = item.getCount() * count;
if (player.getInventory().validateWeight(weight))
@@ -188,6 +202,34 @@ public class RequestBRBuyProduct implements IClientIncomingPacket
return true;
}
/**
* Check if player can receive Gift from L2 Store
* @param player player in question
* @param item requested item.
* @return true if player can receive gift item.
*/
private static boolean canReceiveGift(PlayerInstance player, PrimeShopGroup item)
{
if (!Config.VIP_SYSTEM_ENABLED)
{
return false;
}
if (player.getVipTier() <= 0)
{
return false;
}
else if (item.getVipTier() != player.getVipTier())
{
player.sendMessage("This item is not for your vip tier!");
return false;
}
else
{
long timeBought = player.getAccountVariables().getLong(AccountVariables.VIP_ITEM_BOUGHT, 0L);
return timeBought <= 0;
}
}
private static int validatePaymentId(PrimeShopGroup item, long amount)
{
switch (item.getPaymentType())

View File

@@ -88,6 +88,13 @@ public class RequestBRPresentBuyProduct implements IClientIncomingPacket
player.addRequest(new PrimeShopRequest(player));
final PrimeShopGroup item = PrimeShopData.getInstance().getItem(_brId);
if (item.isVipGift())
{
player.sendMessage("You cannot gift a Vip Gift!");
return;
}
if (validatePlayer(item, _count, player))
{
final int price = (item.getPrice() * _count);
@@ -116,6 +123,10 @@ public class RequestBRPresentBuyProduct implements IClientIncomingPacket
return;
}
player.setPrimePoints(player.getPrimePoints() - price);
if (Config.VIP_SYSTEM_PRIME_AFFECT)
{
player.updateVipPoints(price);
}
}
player.sendPacket(new ExBRBuyProduct(ExBrProductReplyType.SUCCESS));

View File

@@ -0,0 +1,37 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.vip;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.vip.ReceiveVipInfo;
public class ExRequestVipInfo implements IClientIncomingPacket
{
@Override
public boolean read(GameClient client, PacketReader packet)
{
return true;
}
@Override
public void run(GameClient client)
{
client.sendPacket(new ReceiveVipInfo(client.getPlayer()));
}
}

View File

@@ -0,0 +1,37 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.vip;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.vip.ReceiveVipLuckyGameInfo;
public class RequestVipLuckGameInfo implements IClientIncomingPacket
{
@Override
public boolean read(GameClient client, PacketReader packet)
{
return true;
}
@Override
public void run(GameClient client)
{
client.sendPacket(new ReceiveVipLuckyGameInfo(client.getPlayer()));
}
}

View File

@@ -0,0 +1,41 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author Gabriel Costa Souza
*/
public class ExBRNewIconCashBtnWnd implements IClientOutgoingPacket
{
private final short _active;
public ExBRNewIconCashBtnWnd(short active)
{
_active = active;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_BR_NEW_ICON_CASH_BTN_WND.writeId(packet);
packet.writeH(_active);
return true;
}
}

View File

@@ -38,7 +38,7 @@ public class ExBrPremiumState implements IClientOutgoingPacket
OutgoingPackets.EX_BR_PREMIUM_STATE.writeId(packet);
packet.writeD(_player.getObjectId());
packet.writeC(_player.hasPremiumStatus() ? 0x01 : 0x00);
packet.writeC(_player.hasPremiumStatus() || (_player.getVipTier() > 0) ? 0x01 : 0x00);
return true;
}
}

View File

@@ -30,7 +30,7 @@ public class ExWorldChatCnt implements IClientOutgoingPacket
public ExWorldChatCnt(PlayerInstance player)
{
_points = player.getLevel() < Config.WORLD_CHAT_MIN_LEVEL ? 0 : Math.max(player.getWorldChatPoints() - player.getWorldChatUsed(), 0);
_points = (player.getLevel() < Config.WORLD_CHAT_MIN_LEVEL) || (player.getVipTier() <= 0) ? 0 : Math.max(player.getWorldChatPoints() - player.getWorldChatUsed(), 0);
}
@Override

View File

@@ -0,0 +1,60 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.vip;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.vip.VipManager;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
public class ReceiveVipInfo implements IClientOutgoingPacket
{
private final PlayerInstance _player;
public ReceiveVipInfo(PlayerInstance player)
{
_player = player;
}
@Override
public boolean write(PacketWriter packet)
{
if (!Config.VIP_SYSTEM_ENABLED)
{
return false;
}
final VipManager vipManager = VipManager.getInstance();
final byte vipTier = _player.getVipTier();
final int vipDuration = (int) ChronoUnit.SECONDS.between(Instant.now(), Instant.ofEpochMilli(_player.getVipTierExpiration()));
OutgoingPackets.RECIVE_VIP_INFO.writeId(packet);
packet.writeC(vipTier);
packet.writeQ(_player.getVipPoints());
packet.writeD(vipDuration);
packet.writeQ(vipManager.getPointsToLevel((byte) (vipTier + 1)));
packet.writeQ(vipManager.getPointsDepreciatedOnLevel(vipTier));
packet.writeC(vipTier);
packet.writeQ(vipManager.getPointsToLevel(vipTier));
return true;
}
}

View File

@@ -0,0 +1,48 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.vip;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Gabriel Costa Souza
*/
public class ReceiveVipLuckyGameInfo implements IClientOutgoingPacket
{
private final PlayerInstance _player;
public ReceiveVipLuckyGameInfo(PlayerInstance player)
{
_player = player;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.RECIVE_VIP_LUCKY_GAME_INFO.writeId(packet);
packet.writeC(1); // enabled
packet.writeH((int) _player.getAdena());
final ItemInstance item = _player.getInventory().getItemByItemId(Inventory.LCOIN_ID);
packet.writeH(item == null ? 0 : (int) item.getCount()); // L Coin count
return true;
}
}