Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Mensajes recientes

#1
NPC / Npc Enchant
Último mensaje por Swarlog - Ene 24, 2025, 07:32 PM
package custom.Enchant;

import java.util.logging.Logger;

import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.olympiad.OlympiadManager;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.network.serverpackets.CharInfo;
import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jserver.gameserver.network.serverpackets.UserInfo;

public class Enchant extends Quest
{
    public static final Logger _log = Logger.getLogger(Enchant.class.getName());

    private final static int npcId = 9994;

    // Item required to enchant armor +1
    private final static int itemRequiredArmor = 6393;
    private final static int itemRequiredArmorCount = 50;

    // Item required to enchant jewels +1
    private final static int itemRequiredJewels = 6393;
    private final static int itemRequiredJewelsCount = 50;

    // Item required to enchant weapon +1
    private final static int itemRequiredWeapon = 6393;
    private final static int itemRequiredWeaponCount = 150;

    // Item required to enchant belt/shirt +1
    private final static int itemRequiredBeltShirt = 6393;
    private final static int itemRequiredBeltShirtCount = 100;

    public Enchant(int questId, String name, String descr)
    {
        super(questId, name, descr);
       
        addStartNpc(npcId);
        addFirstTalkId(npcId);
        addTalkId(npcId);
    }
   
    public static void main(String[] args)
    {
        new Enchant(-1, Enchant.class.getSimpleName(), "custom");
    }
   
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        String enchantType = "Enchant.htm";

        if (player.getQuestState(getName()) == null)
        {
            newQuestState(player);
        }
        else if (player.isInCombat())
        {
            return drawHtml("You are in combat", "Don't fight if you want to talk with me!", enchantType);
        }
        else if (player.getPvpFlag() == 1)
        {
            return drawHtml("You are flagged", "Don't fight if you want to talk with me!", enchantType);
        }
        else if (player.getKarma() != 0)
        {
            return drawHtml("You are in chaotic state", "Don't fight if you want to talk with me!", enchantType);
        }
        else if (OlympiadManager.getInstance().isRegistered(player))
        {
            return drawHtml("You are registered for Olympiad", "You can't use my services<br1>while playing the Olympiad.", enchantType);
        }

        return "Enchant.htm";
    }

    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        String htmlText = event;

        String enchantType = "Enchant.htm";

        int armorType = -1;

        // Armor parts
        if (event.equals("enchantHelmet"))
        {
            armorType = Inventory.PAPERDOLL_HEAD;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        else if (event.equals("enchantChest"))
        {
            armorType = Inventory.PAPERDOLL_CHEST;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        else if (event.equals("enchantLeggings"))
        {
            armorType = Inventory.PAPERDOLL_LEGS;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        else if (event.equals("enchantGloves"))
        {
            armorType = Inventory.PAPERDOLL_GLOVES;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        else if (event.equals("enchantBoots"))
        {
            armorType = Inventory.PAPERDOLL_FEET;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        else if (event.equals("enchantShieldOrSigil"))
        {
            armorType = Inventory.PAPERDOLL_LHAND;
            enchantType = "EnchantArmor.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredArmor, itemRequiredArmorCount);
        }
        // Jewels
        else if (event.equals("enchantUpperEarring"))
        {
            armorType = Inventory.PAPERDOLL_LEAR;
            enchantType = "EnchantJewels.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredJewels, itemRequiredJewelsCount);
        }
        else if (event.equals("enchantLowerEarring"))
        {
            armorType = Inventory.PAPERDOLL_REAR;
            enchantType = "EnchantJewels.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredJewels, itemRequiredJewelsCount);
        }
        else if (event.equals("enchantNecklace"))
        {
            armorType = Inventory.PAPERDOLL_NECK;
            enchantType = "EnchantJewels.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredJewels, itemRequiredJewelsCount);
        }
        else if (event.equals("enchantUpperRing"))
        {
            armorType = Inventory.PAPERDOLL_LFINGER;
            enchantType = "EnchantJewels.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredJewels, itemRequiredJewelsCount);
        }
        else if (event.equals("enchantLowerRing"))
        {
            armorType = Inventory.PAPERDOLL_RFINGER;
            enchantType = "EnchantJewels.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredJewels, itemRequiredJewelsCount);
        }
        // Belt/Shirt
        else if (event.equals("enchantBelt"))
        {
            armorType = Inventory.PAPERDOLL_BELT;
            enchantType = "EnchantBeltShirt.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredBeltShirt, itemRequiredBeltShirtCount);
        }
        else if (event.equals("enchantShirt"))
        {
            armorType = Inventory.PAPERDOLL_UNDER;
            enchantType = "EnchantBeltShirt.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredBeltShirt, itemRequiredBeltShirtCount);
        }
        // Weapon
        else if (event.equals("enchantWeapon"))
        {
            armorType = Inventory.PAPERDOLL_RHAND;
            enchantType = "EnchantWeapon.htm";
           
            htmlText = enchant(enchantType, player, armorType, itemRequiredWeapon, itemRequiredWeaponCount);
        }

        return htmlText;
    }

    private String enchant(String enchantType, L2PcInstance player, int armorType, int itemRequired, int itemRequiredCount)
    {
        QuestState st = player.getQuestState(getName());

        int currentEnchant = 0;
        int newEnchantLevel = 0;

        if (st.getQuestItemsCount(itemRequired) >= itemRequiredCount)
        {
            try
            {
                L2ItemInstance item = getItemToEnchant(player, armorType);

                if (item != null)
                {
                    if ( item.isItem() && item.isEquipable() && !item.isConsumable() && !item.isCommonItem() && !item.isOlyRestrictedItem() && !item.isShadowItem() && !item.isQuestItem() )
                    {
                        currentEnchant = item.getEnchantLevel();

                        if ( currentEnchant < 18 )
                        {
                            newEnchantLevel = setEnchant(player, item, currentEnchant+1, armorType);

                            if ( newEnchantLevel > 0 )
                            {
                                st.takeItems(itemRequired, itemRequiredCount);
                                player.sendMessage("You successfully enchanted your " + item.getItem().getName() +" from +" + currentEnchant + " to +" + newEnchantLevel + "!");

                                String htmlContent = "<center>You successfully enchanted your:<br>"+
                                                        "<font color=\"FF7200\">" + item.getItem().getName() + "</font><br>"+
                                                        "From: <font color=\"AEFF00\">+" + currentEnchant + "</font> to <font color=\"AEFF00\">+" + newEnchantLevel + "</font>"+
                                                    "</center>";

                                return drawHtml("Congratulations!", htmlContent, enchantType);
                            }
                        }
                        else
                        {
                            player.sendMessage("Your " + item.getItem().getName() + " is already +20!");
                            return drawHtml("It's already +20", "<center>Your <font color=\"FF7200\">" + item.getItem().getName() +"</font> is already +20!</center>", enchantType);
                        }
                    }
                    else
                    {
                        player.sendMessage("Your " + item.getItem().getName() + " is not enchantable!");
                        return drawHtml("Not enchantable item!", "<center>Your <font color=\"FF7200\">" + item.getItem().getName() +"</font> is not enchantable!</center>", enchantType);
                    }
                }
            }
            catch (StringIndexOutOfBoundsException e)
            {
                player.sendMessage("Something went wrong. Are equiped with the item?");
                return drawHtml("Error Enchant", "<center>Something went wrong.<br>Are equiped with the item?</center>", enchantType);
            }
            catch (NumberFormatException e)
            {
                player.sendMessage("Something went wrong. Are equiped with the item?");
                return drawHtml("Error Enchant", "<center>Something went wrong.<br>Are equiped with the item?</center>", enchantType);
            }


            player.sendMessage("Something went wrong. Are equiped with the item?");
            return drawHtml("Error Enchant", "<center>Something went wrong.<br>Are equiped with the item?</center>", enchantType);
        }
        else
        {
            String content = "<center>"+
                                "Not enough <font color=\"FF7200\">Event - Glitering Medals</font>!<br>";

                    if ( st.getQuestItemsCount(itemRequired) > 0 )
                    {
                        content += "You have " + st.getQuestItemsCount(itemRequired) + " Glittering Medals,<br1>"+
                                    "Need " + (itemRequiredCount - st.getQuestItemsCount(itemRequired)) + " more.";
                    }
                    else
                    {
                        content += "You need <font color=\"FF7200\">" + itemRequiredCount + " Event - Glitering Medals</font>!";
                    }

                    content += "</center>";

            return drawHtml("Not Enough Items", content, enchantType);
        }
    }

    private L2ItemInstance getItemToEnchant(L2PcInstance player, int armorType)
    {
        L2ItemInstance itemInstance = null;
        L2ItemInstance parmorInstance = player.getInventory().getPaperdollItem(armorType);

        if ((parmorInstance != null) && (parmorInstance.getLocationSlot() == armorType))
        {
            itemInstance = parmorInstance;

            if (itemInstance != null)
            {
                return itemInstance;
            }
        }

        return null;
    }

    private int setEnchant(L2PcInstance player, L2ItemInstance item, int newEnchantLevel, int armorType)
    {
        if (item != null)
        {
            // set enchant value
            player.getInventory().unEquipItemInSlot(armorType);
            item.setEnchantLevel(newEnchantLevel);
            player.getInventory().equipItem(item);
           
            // send packets
            InventoryUpdate iu = new InventoryUpdate();
            iu.addModifiedItem(item);
            player.sendPacket(iu);
            player.broadcastPacket(new CharInfo(player));
            player.sendPacket(new UserInfo(player));
            player.broadcastPacket(new ExBrExtraUserInfo(player));

            return newEnchantLevel;
        }

        return -1;
    }

    public String drawHtml(String title, String content, String enchantType)
    {
        String html = "<html>"+
                        "<title>NPC Enchanter</title>"+
                        "<body>"+
                            "<center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"+
                            "<font color=\"FF9900\">" + title + "</font></center><br>"+
                            content +
                            "<br><br>"+
                            "<center><a action=\"bypass -h Quest Enchant " + enchantType + "\">Go Back</a></center>"+
                        "</body>"+
                        "</html>";

        return html;
    }
}
#2
Implementaciones / Re:Pet Fusion
Último mensaje por Neron - Ene 22, 2025, 11:04 PM
La idea es buena, voy a probarlo.

Gracias.
#3
Eventos / Re:Evento Ninja Adventures
Último mensaje por Neron - Ene 22, 2025, 11:04 PM
Hostia, este evento no lo tenia yo.

Gracias por compartirlo swar
#4
Eventos / Re:Evento Hidden Bastard
Último mensaje por Swarlog - Ene 22, 2025, 10:59 PM
Gracias por el aporte Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate
#5
Eventos / Evento Ninja Adventures
Último mensaje por Swarlog - Ene 22, 2025, 10:55 PM
/*
 * 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 events.NinjaAdventures;

import org.l2jdevs.gameserver.ai.CtrlIntention;
import org.l2jdevs.gameserver.model.L2Clan;
import org.l2jdevs.gameserver.model.actor.L2Attackable;
import org.l2jdevs.gameserver.model.actor.L2Character;
import org.l2jdevs.gameserver.model.actor.L2Npc;
import org.l2jdevs.gameserver.model.actor.instance.L2PcInstance;
import org.l2jdevs.gameserver.model.quest.Quest;
import org.l2jdevs.gameserver.model.quest.QuestState;
import org.l2jdevs.gameserver.model.quest.State;
import org.l2jdevs.util.Rnd;

import events.EventsConfig;

public class NinjaAdventures extends Quest
{
private static final String qn = "NinjaAdventures";

/*
* List of npcs
* Need update list of mobs to kill
*/
private static final int Ninja_Master = 7102;

/*
* Konoha - Isle of Prayer Mobs
*/
private static final int[] Konoha_Mobs = {
22257,22258,22259,22260,22261,22262,22263,22264,22265,
22266,22267
};

/*
* Kusa - Forge of The Gods First Level Mobs
*/
private static final int[] Kusa_Mobs = {
21394,21376,21377,21378,21652,21379,21653,21381,21380,
21384,21654,21383,21382,21655,21385,21386
};

/*
* Kiri - Valley of Saints
*/
private static final int[] Kiri_Mobs = {
21523,21526,21520,21524,21521,21524,21529,21530
};

/*
* Suna - Forest of Dead
*/
private static final int[] Suna_Mobs = {
21570,21572,21574,21578,21561,21559,21598,21597,
21557,21567,21565,21553,21547,21563,21596
};

/*
* Yuki - Forge of The Gods First Level Mobs
*/
private static final int[] Yuki_Mobs = {
21394,21376,21377,21378,21652,21379,21653,21381,21380,
21384,21654,21383,21382,21655,21385,21386
};

/*
* Taki - Wall of Argos
*/
private static final int[] Taki_Mobs = {
21298,21299,21304,21305,21303,21307,21308,21309,21310,
21311
};

/*
* Oto - Imperial Tomb
*/
private static final int[] Oto_Mobs = {
21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,
21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,
21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,
21426,21427,21428,21429,21430,21431
};

/*
* Ninja Mobs - need update and add new mobs
*/
private static final int Konoha_Ninja = 70001;
private static final int Kusa_Ninja = 70002;
private static final int Kiri_Ninja = 70003;
private static final int Suna_Ninja = 70004;
private static final int Yuki_Ninja = 70005;
private static final int Taki_Ninja = 70006;
private static final int Oto_Ninja = 70007;

/*
* Total Points of "Gakure" - Villages
* Konoha - Li��, Kusa - Trawa, Kiri - Mg�a, Suna - Piasek,
* Yuki - �nieg, Taki - Wodospad, Oto - D�wi�k
* @author: L2m Project
*/
public int Konoha_Points;
public int Kusa_Points;
public int Kiri_Points;
public int Suna_Points;
public int Yuki_Points;
public int Taki_Points;
public int Oto_Points;

/*
* contains for special checorg.l2jdevs mobs id's
* @author: L2m Project
*/
public static boolean contains(int[] array, int obj)
{
for (int i = 0; i < array.length; i++)
{
if (array[i] == obj)
return true;
}
return false;
}

@Override
public final String onFirstTalk(L2Npc npc, L2PcInstance player)
{
QuestState st = player.getQuestState(qn);
if (st == null)
{
st = newQuestState(player);
}
String htmltext = "";
if (st.getState() == State.STARTED)
{
if (EventsConfig.NA_STARTED)
htmltext = "welcome.htm";
else
{
htmltext = EventsConfig.EVENT_DISABLED;
}
return htmltext;
}
if (EventsConfig.NA_STARTED)
htmltext = "select.htm";
else
{
htmltext = EventsConfig.EVENT_DISABLED;
}
return htmltext;
}

/*
* Selecting Prizes and checorg.l2jdevs current points
* @author: L2m Project
*/
@Override
public final String onAdvEvent (String event, L2Npc npc, L2PcInstance player)
{
QuestState st = player.getQuestState(qn);
if (st == null)
{
st = newQuestState(player);
}
/*
* Integer Values
* Villages:
* Konoha - Li��, Kusa - Trawa, Kiri - Mg�a, Suna - Piasek,
* Yuki - �nieg, Taki - Wodospad, Oto - D�wi�k
*/
int village = st.getInt("village");
int points = st.getInt("points");
int recomend_vallue = st.getInt("recomendvalue");
int adena_vallue = st.getInt("adenavalue");
int aadena_vallue = st.getInt("aadenavalue");
int clanpoints_vallue = st.getInt("clanpoints_vallue");
int Konoha_Value = (Konoha_Points - Suna_Points - Oto_Points);
int Kusa_Value = (Kusa_Points - Taki_Points - Oto_Points);
int Kiri_Value = (Kiri_Points - Kusa_Points - Yuki_Points);
int Suna_Value = (Suna_Points - Konoha_Points - Taki_Points);
int Taki_Value = (Taki_Points - Suna_Points - Yuki_Points);
int Yuki_Value = (Yuki_Points - Konoha_Points - Kusa_Points);
int Oto_Value = (Oto_Points - Konoha_Points - Kusa_Points);
//
int gakure_select = st.getInt("gakure");
/*
* String builder for text
*/
String htmltext = "";
String vilage = "";
/*
* Script for checorg.l2jdevs Points
*/
if (event.equalsIgnoreCase("checkpoints"))
{
switch(village)
{
case 1:
vilage = "Konoha";
break;
case 2:
vilage = "Kusa";
break;
case 3:
vilage = "Kiri";
break;
case 4:
vilage = "Suna";
break;
case 5:
vilage = "Yuki";
break;
case 6:
vilage = "Taki";
break;
case 7:
vilage = "Oto";
break;
}
return "<html><font color=LEVEL>Ninja Master</font><br><br>Hello you fight good for <font color=LEVEL>" + vilage + " Village</font> and your kill points now: &nbsp;<br><br><font color=AC13DD> " + points + " </html>";
}
/*
* Script for select Village
*/
if (event.equalsIgnoreCase("gakure"))
{
gakure_select = Rnd.get(1,7);
switch(gakure_select)
{
case 1:
st.set("village","1");
break;
case 2:
st.set("village","2");
break;
case 3:
st.set("village","3");
break;
case 4:
st.set("village","4");
break;
case 5:
st.set("village","5");
break;
case 6:
st.set("village","6");
break;
case 7:
st.set("village","7");
break;
}
st.setState(State.STARTED);
htmltext = "welcome.htm";
st.giveItems(EventsConfig.NA_HAIRBAND, 1);
}
/*
* Script for global village select list of prizes
*/
if (event.equalsIgnoreCase("prizes"))
{
if (village == 1)
{
htmltext = "prizes.htm";
}
if (village == 2)
{
htmltext = "prizes.htm";
}
if (village == 3)
{
htmltext = "prizes.htm";
}
if (village == 4)
{
htmltext = "prizes.htm";
}
if (village == 5)
{
htmltext = "prizes.htm";
}
if (village == 6)
{
htmltext = "prizes.htm";
}
if (village == 7)
{
htmltext = "prizes.htm";
}
}
/*
* Script for add selected prizes
* recommend, adena, ancient adena, clan points
* multiple selection for check global points of villages
*/
if (event.equalsIgnoreCase("get_recommend"))
{
if (village == 1)
{
recomend_vallue = (Konoha_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 2)
{
recomend_vallue = (Kusa_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 3)
{
recomend_vallue = (Kiri_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 4)
{
recomend_vallue = (Suna_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 5)
{
recomend_vallue = (Yuki_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 6)
{
recomend_vallue = (Taki_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 7)
{
recomend_vallue = (Oto_Value - 100 + points);
if (recomend_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
if (recomend_vallue > 100)
{
recomend_vallue = 100;
}
player.setRecomHave(recomend_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
}
/*
* Adena Prizes
*/
if (event.equalsIgnoreCase("give_adena"))
{
if (village == 1)
{
adena_vallue = (Konoha_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 2)
{
adena_vallue = (Kusa_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 3)
{
adena_vallue = (Kiri_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 4)
{
adena_vallue = (Suna_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 5)
{
adena_vallue = (Yuki_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 6)
{
adena_vallue = (Taki_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 7)
{
adena_vallue = (Oto_Value - 500 + points*2);
if (adena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ADENA, adena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
}
/*
* Ancient Adena Prizes
*/
if (event.equalsIgnoreCase("give_aadena"))
{
if (village == 1)
{
aadena_vallue = (Konoha_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 2)
{
aadena_vallue = (Kusa_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 3)
{
aadena_vallue = (Kiri_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 4)
{
aadena_vallue = (Suna_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 5)
{
aadena_vallue = (Yuki_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 6)
{
aadena_vallue = (Taki_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 7)
{
aadena_vallue = (Oto_Value - 2500 + points*2);
if (aadena_vallue < 1 || points < 1)
{
player.sendMessage("You have enough killing points.");
htmltext = "prizes.htm";
}
else
{
st.giveItems(EventsConfig.NA_ANCIENT_ADENA, aadena_vallue);
htmltext = "prizes.htm";
st.set("points","0");
}
}
}
/*
* Clan Points
*/
if (event.equalsIgnoreCase("give_clanpoints"))
{
if (player.getClan() == null)
{
player.sendMessage("You are not in clan.");
htmltext = "prizes.htm";
}
else
{
if (village == 1)
{
clanpoints_vallue = (Konoha_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5  || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 2)
{
clanpoints_vallue = (Kusa_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 3)
{
clanpoints_vallue = (Kiri_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 4)
{
clanpoints_vallue = (Suna_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 5)
{
clanpoints_vallue = (Yuki_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 6)
{
clanpoints_vallue = (Taki_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
if (village == 7)
{
clanpoints_vallue = (Oto_Value - 3500 + points*2);
L2Clan clan = player.getClan();
if (clan.getLevel() < 5 || clanpoints_vallue < 1)
{
player.sendMessage("You are not in clan with level 5, or you have enough killing points.");
htmltext = "prizes.htm";
}
else
{
clan.addReputationScore(clanpoints_vallue, true);
htmltext = "prizes.htm";
st.set("points","0");
}
}
}
}
/*
* Informations about - targets and prizes
*/
if (event.equalsIgnoreCase("info"))
{
if (village == 1)
{
htmltext = "info.htm";
}
if (village == 2)
{
htmltext = "info.htm";
}
if (village == 3)
{
htmltext = "info.htm";
}
if (village == 4)
{
htmltext = "info.htm";
}
if (village == 5)
{
htmltext = "info.htm";
}
if (village == 6)
{
htmltext = "info.htm";
}
if (village == 7)
{
htmltext = "info.htm";
}
}
if (event.equalsIgnoreCase("back"))
{
htmltext = "welcome.htm";
}
        return htmltext;
}
@Override
public final String onKill(L2Npc npc,L2PcInstance player, boolean isPet)
{
QuestState st = player.getQuestState(qn);
if (st == null)
{
st = newQuestState(player);
}
else
{
if (st.getState() != State.STARTED)
{
return null;
}
}
if (!EventsConfig.NA_STARTED)
{
// Event State False so Event is disabled
}
else
{
int village = st.getInt("village");
int npcId = npc.getNpcId();
int points = st.getInt("points");
if (village == 1)
{
if ( npcId == Konoha_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Konoha_Points = Konoha_Points + 2;
Suna_Points = Suna_Points -1;
Oto_Points = Oto_Points -1;
}
if (contains(Konoha_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Konoha_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);               
}
}
if (village == 2)
{
if (npcId == Kusa_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Kusa_Points = Kusa_Points + 2;
Taki_Points = Taki_Points -1;
Oto_Points = Oto_Points -1;
}
if (contains(Kusa_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Kusa_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);               
}
}
if (village == 3)
{
if (npcId == Kiri_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Kiri_Points = Kiri_Points + 2;
Kusa_Points = Kusa_Points - 1;
Yuki_Points = Yuki_Points - 1;
}
if (contains(Kiri_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Kiri_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
if (village == 4)
{
if (npcId == Suna_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Suna_Points = Suna_Points + 2;
Konoha_Points = Konoha_Points -1;
Taki_Points = Taki_Points -1;
}
if (contains(Suna_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Suna_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
if (village == 5)
{
if (npcId == Yuki_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Yuki_Points = Yuki_Points + 2;
Konoha_Points = Konoha_Points -1;
Kusa_Points = Kusa_Points -1;
}
if (contains(Yuki_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Yuki_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
if (village == 6)
{
if (npcId == Taki_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Taki_Points = Taki_Points + 2;
Suna_Points = Suna_Points -1;
Yuki_Points = Yuki_Points -1;
}
if (contains(Taki_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Taki_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
if (village == 7)
{
if (npcId == Oto_Ninja && EventsConfig.NA_STARTED)
{
points = points +2;
st.set("points", "" + points);
Oto_Points = Oto_Points + 2;
Konoha_Points = Konoha_Points -1;
Kusa_Points = Kusa_Points - 1;
}
if (contains(Oto_Mobs, npcId) && EventsConfig.NA_STARTED)
{
L2Attackable newNpc = (L2Attackable) st.addSpawn(Oto_Ninja, 60000);
L2Character originalAttacker = isPet? player.getSummon(): player;
newNpc.setRunning();
newNpc.addDamageHate(originalAttacker,0,600);
newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
}
return super.onKill(npc, player, isPet);
}

public NinjaAdventures(int questId, String name, String descr)
{
super(questId, name, descr);

addStartNpc(Ninja_Master);
addFirstTalkId(Ninja_Master);
addTalkId(Ninja_Master);
/*
* Addings mobs to kill
*/
for (int id : Konoha_Mobs)
{
addKillId(id);
}
for (int id : Kusa_Mobs)
{
addKillId(id);
}
for (int id : Kiri_Mobs)
{
addKillId(id);
}
for (int id : Suna_Mobs)
{
addKillId(id);
}
for (int id : Yuki_Mobs)
{
addKillId(id);
}
for (int id : Taki_Mobs)
{
addKillId(id);
}
for (int id : Oto_Mobs)
{
addKillId(id);
}
/*
* Mob to points spawned when kill normal monsters
*/
addKillId(Konoha_Ninja);
addKillId(Kusa_Ninja);
addKillId(Kiri_Ninja);
addKillId(Suna_Ninja);
addKillId(Yuki_Ninja);
addKillId(Taki_Ninja);
addKillId(Oto_Ninja);
}

public static void main(String[] args)
{
new NinjaAdventures(-1,qn,"events");
if (EventsConfig.NA_STARTED)
_log.info("Event System: Ninja Adventures Event loaded ...");
}
}
#6
Implementaciones / Pet Fusion
Último mensaje por Swarlog - Ene 22, 2025, 10:47 PM
### Eclipse Workspace Patch 1.0
#P Clean_Core
Index: java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java
===================================================================
--- java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java (revision 3067)
+++ java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java (working copy)
@@ -177,7 +177,9 @@
  COREDONE,
 
  // unimplemented
- NOTDONE, BALLISTA;
+ NOTDONE,
+ BALLISTA,
+ PETFUSION;
 
  private final Class<? extends L2Skill> _class;
 
Index: java/net/sf/l2j/gameserver/model/actor/L2Character.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/L2Character.java (revision 3067)
+++ java/net/sf/l2j/gameserver/model/actor/L2Character.java (working copy)
@@ -1819,6 +1819,15 @@
             sendPacket(ActionFailed.STATIC_PACKET);
             return false;
         }
+       
+        // Pet validation for petfusion skill
+ if(skill.getSkillType() == L2SkillType.PETFUSION && getPet() == null)
+ {
+ SystemMessage sm = new SystemMessage(SystemMessageId.S1_CANNOT_BE_USED);
+ sm.addSkillName(skill);
+            sendPacket(sm);
+            return false;
+ }
 
         // Check if the caster has enough HP
         if (getCurrentHp() <= skill.getHpConsume())
Index: java/net/sf/l2j/gameserver/model/L2Skill.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Skill.java (revision 3067)
+++ java/net/sf/l2j/gameserver/model/L2Skill.java (working copy)
@@ -294,6 +294,7 @@
  private final boolean _isSuicideAttack;
  private final boolean _canBeReflected;
 
+ private boolean _isFusionSkill;
 
     protected L2Skill(StatsSet set)
     {
@@ -473,10 +474,17 @@
         _flyRadius = set.getInteger("flyRadius", 200);
         _flyCourse = set.getFloat("flyCourse", 0);
         _canBeReflected = set.getBool("canBeReflected", true);
+       
+        _isFusionSkill = set.getBool("isPetFusionSkill", false);
     }
 
     public abstract void useSkill(L2Character caster, L2Object[] targets);
 
+    public final boolean isPetFusion()
+    {
+    return _isFusionSkill;
+    }
+   
     public final boolean isPotion()
     {
         return _ispotion;

### Eclipse Workspace Patch 1.0
#P Clean_DP
Index: data/stats/skills/0900-0999.xml
===================================================================
--- data/stats/skills/0900-0999.xml (revision 6130)
+++ data/stats/skills/0900-0999.xml (working copy)
@@ -321,22 +321,49 @@
   <set name="operateType" val="OP_PASSIVE"/>
 </skill>
 <skill id="929" levels="1" name="Spirit of the Cat">
-  <set name="target" val="TARGET_NONE"/>
-  <set name="skillType" val="NOTDONE"/>
-  <set name="operateType" val="OP_PASSIVE"/>
-  <set name="reuseDelay" val="360000"/>
+  <!--  Done by Blacko  -->
+  <set name="mpConsume" val="73"/>
+  <set name="hitTime" val="2500"/>
+  <set name="reuseDelay" val="1200000"/> <!-- Guessing -->
+  <set name="target" val="TARGET_SELF"/>
+  <set name="skillType" val="PETFUSION"/>
+  <set name="operateType" val="OP_ACTIVE"/>
+  <set name="isMagic" val="true"/>
+  <set name="transformId" val="219"/>
+  <set name="isFusionSkill" val="true"/>
+  <for>
+    <effect name="Transformation" time="300" val="0"/>
+  </for>
 </skill>
 <skill id="930" levels="1" name="Spirit of the Demon">
-  <set name="target" val="TARGET_NONE"/>
-  <set name="skillType" val="NOTDONE"/>
-  <set name="operateType" val="OP_PASSIVE"/>
-  <set name="reuseDelay" val="360000"/>
+  <!--  Done by Blacko  -->
+  <set name="mpConsume" val="73"/>
+  <set name="hitTime" val="2500"/>
+  <set name="reuseDelay" val="1200000"/> <!-- Guessing  -->
+  <set name="target" val="TARGET_SELF"/>
+  <set name="skillType" val="PETFUSION"/>
+  <set name="operateType" val="OP_ACTIVE"/>
+  <set name="isMagic" val="true"/>
+  <set name="transformId" val="221"/>
+  <set name="isFusionSkill" val="true"/>
+  <for>
+    <effect name="Transformation" time="300" val="0"/>
+  </for>
 </skill>
 <skill id="931" levels="1" name="Spirit of the Unicorn">
-  <set name="target" val="TARGET_NONE"/>
-  <set name="skillType" val="NOTDONE"/>
-  <set name="operateType" val="OP_PASSIVE"/>
-  <set name="reuseDelay" val="360000"/>
+  <!--  Done by Blacko  -->
+  <set name="mpConsume" val="73"/>
+  <set name="hitTime" val="2500"/>
+  <set name="reuseDelay" val="1200000"/> <!-- Guessing -->
+  <set name="target" val="TARGET_SELF"/>
+  <set name="skillType" val="PETFUSION"/>
+  <set name="operateType" val="OP_ACTIVE"/>
+  <set name="isMagic" val="true"/>
+  <set name="transformId" val="220"/>
+  <set name="isFusionSkill" val="true"/>
+  <for>
+    <effect name="Transformation" time="300" val="0"/>
+  </for>
 </skill>
 <skill id="932" levels="9" name="Star Stone Gathering">
   <set name="target" val="TARGET_NONE"/>
Index: data/scripts/transformations/SummonerUnicorn.java
===================================================================
--- data/scripts/transformations/SummonerUnicorn.java (revision 0)
+++ data/scripts/transformations/SummonerUnicorn.java (revision 0)
@@ -0,0 +1,66 @@
+package transformations;
+
+import net.sf.l2j.gameserver.datatables.SkillTable;
+import net.sf.l2j.gameserver.instancemanager.TransformationManager;
+import net.sf.l2j.gameserver.model.L2Transformation;
+
+/**
+ * Description: <br>
+ * This will handle the transformation, giving the skills, and removing them, when the player logs out and is transformed these skills
+ * do not save.
+ * When the player logs back in, there will be a call from the enterworld packet that will add all their skills.
+ * The enterworld packet will transform a player.
+ *
+ * @author Ahmed
+ *
+ */
+public class SummonerUnicorn extends L2Transformation
+{
+ public SummonerUnicorn()
+ {
+ // id, duration (secs), colRadius, colHeight
+ super(221, 300, 12.0, 30.0);
+ }
+
+ public void onTransform()
+ {
+ if (getPlayer().getTransformationId() != 221 || getPlayer().isCursedWeaponEquipped())
+ return;
+
+ // give transformation skills
+ transformedSkills();
+ }
+
+ public void transformedSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{619,5491});
+ }
+
+ public void onUntransform()
+ {
+ // remove transformation skills
+ removeSkills();
+ }
+
+ public void removeSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{});
+ }
+
+ public static void main(String[] args)
+ {
+ TransformationManager.getInstance().registerTransformation(new SummonerUnicorn());
+ }
+}
Index: data/scripts/transformations/SummonerSpectral.java
===================================================================
--- data/scripts/transformations/SummonerSpectral.java (revision 0)
+++ data/scripts/transformations/SummonerSpectral.java (revision 0)
@@ -0,0 +1,66 @@
+package transformations;
+
+import net.sf.l2j.gameserver.datatables.SkillTable;
+import net.sf.l2j.gameserver.instancemanager.TransformationManager;
+import net.sf.l2j.gameserver.model.L2Transformation;
+
+/**
+ * Description: <br>
+ * This will handle the transformation, giving the skills, and removing them, when the player logs out and is transformed these skills
+ * do not save.
+ * When the player logs back in, there will be a call from the enterworld packet that will add all their skills.
+ * The enterworld packet will transform a player.
+ *
+ * @author Ahmed
+ *
+ */
+public class SummonerSpectral extends L2Transformation
+{
+ public SummonerSpectral()
+ {
+ // id, duration (secs), colRadius, colHeight
+ super(220, 300, 12.0, 30.0);
+ }
+
+ public void onTransform()
+ {
+ if (getPlayer().getTransformationId() != 220 || getPlayer().isCursedWeaponEquipped())
+ return;
+
+ // give transformation skills
+ transformedSkills();
+ }
+
+ public void transformedSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{619,5491});
+ }
+
+ public void onUntransform()
+ {
+ // remove transformation skills
+ removeSkills();
+ }
+
+ public void removeSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{});
+ }
+
+ public static void main(String[] args)
+ {
+ TransformationManager.getInstance().registerTransformation(new SummonerSpectral());
+ }
+}
Index: data/scripts/handlers/MasterHandler.java
===================================================================
--- data/scripts/handlers/MasterHandler.java (revision 6130)
+++ data/scripts/handlers/MasterHandler.java (working copy)
@@ -205,6 +205,7 @@
  SkillHandler.getInstance().registerSkillHandler(new InstantJump());
  SkillHandler.getInstance().registerSkillHandler(new Dummy());
  SkillHandler.getInstance().registerSkillHandler(new Extractable());
+ SkillHandler.getInstance().registerSkillHandler(new PetFusion());
  _log.config("Loaded " + SkillHandler.getInstance().size() + " SkillHandlers");
  }
 
Index: data/scripts.cfg
===================================================================
--- data/scripts.cfg (revision 6130)
+++ data/scripts.cfg (working copy)
@@ -87,6 +87,9 @@
 transformations/Rabbit.java
 transformations/Ranku.java
 transformations/SaberToothTiger.java
+transformations/SummonerCat.java
+transformations/SummonerSpectral.java
+transformations/SummonerUnicorn.java
 transformations/Teleporter.java
 transformations/Teleporter2.java
 transformations/Timitran.java
Index: data/scripts/handlers/skillhandlers/PetFusion.java
===================================================================
--- data/scripts/handlers/skillhandlers/PetFusion.java (revision 0)
+++ data/scripts/handlers/skillhandlers/PetFusion.java (revision 0)
@@ -0,0 +1,76 @@
+/*
+ * 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.skillhandlers;
+
+import net.sf.l2j.gameserver.handler.ISkillHandler;
+import net.sf.l2j.gameserver.instancemanager.TransformationManager;
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.L2Skill;
+import net.sf.l2j.gameserver.model.actor.L2Character;
+import net.sf.l2j.gameserver.model.actor.L2Summon;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.templates.skills.L2SkillType;
+
+/**
+ * @author Blacko
+ */
+
+public class PetFusion implements ISkillHandler
+{
+ private static final L2SkillType[] SKILL_IDS =
+ {
+ L2SkillType.PETFUSION
+ };
+
+ /**
+ *
+ * @see net.sf.l2j.gameserver.handler.ISkillHandler#useSkill(net.sf.l2j.gameserver.model.actor.L2Character, net.sf.l2j.gameserver.model.L2Skill, net.sf.l2j.gameserver.model.L2Object[])
+ */
+ public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
+ {
+ for (L2Object obj : targets)
+ {
+ L2Character target = (L2Character) obj;
+ if (target != null)
+ {
+ if (activeChar.isAlikeDead())
+ return;
+
+ if (!(activeChar instanceof L2PcInstance))
+ return;
+
+ if(activeChar.isTransformed())
+ return;
+ // here just make the transform, pet validation must be BEFORE the skill casts...
+ int transformId = skill.getTransformId();
+ L2PcInstance player = (L2PcInstance)activeChar;
+ L2Summon pet = player.getPet();
+ pet.unSummon(player);
+ TransformationManager.getInstance().transformPlayer(transformId, player, Long.MAX_VALUE);
+ skill.getEffectsSelf(activeChar);
+ }
+ }
+ }
+
+ /**
+ *
+ * @see net.sf.l2j.gameserver.handler.ISkillHandler#getSkillIds()
+ */
+ public L2SkillType[] getSkillIds()
+ {
+ return SKILL_IDS;
+ }
+}
\ No newline at end of file
Index: data/scripts/transformations/SummonerCat.java
===================================================================
--- data/scripts/transformations/SummonerCat.java (revision 0)
+++ data/scripts/transformations/SummonerCat.java (revision 0)
@@ -0,0 +1,66 @@
+package transformations;
+
+import net.sf.l2j.gameserver.datatables.SkillTable;
+import net.sf.l2j.gameserver.instancemanager.TransformationManager;
+import net.sf.l2j.gameserver.model.L2Transformation;
+
+/**
+ * Description: <br>
+ * This will handle the transformation, giving the skills, and removing them, when the player logs out and is transformed these skills
+ * do not save.
+ * When the player logs back in, there will be a call from the enterworld packet that will add all their skills.
+ * The enterworld packet will transform a player.
+ *
+ * @author Ahmed
+ *
+ */
+public class SummonerCat extends L2Transformation
+{
+ public SummonerCat()
+ {
+ // id, duration (secs), colRadius, colHeight
+ super(219, 300, 12.0, 23.0);
+ }
+
+ public void onTransform()
+ {
+ if (getPlayer().getTransformationId() != 219 || getPlayer().isCursedWeaponEquipped())
+ return;
+
+ // give transformation skills
+ transformedSkills();
+ }
+
+ public void transformedSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().addSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{619,5491});
+ }
+
+ public void onUntransform()
+ {
+ // remove transformation skills
+ removeSkills();
+ }
+
+ public void removeSkills()
+ {
+ // Transfrom Dispel
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(619, 1), false);
+ // Decrease Bow/Crossbow Attack Speed
+ getPlayer().removeSkill(SkillTable.getInstance().getInfo(5491, 1), false);
+ // Send a Server->Client packet StatusUpdate to the L2PcInstance.
+ //getPlayer().sendSkillList();
+ getPlayer().setTransformAllowedSkills(new int[]{});
+ }
+
+ public static void main(String[] args)
+ {
+ TransformationManager.getInstance().registerTransformation(new SummonerCat());
+ }
+}
#7
Eventos / Re:Evento Change of Heart
Último mensaje por Swarlog - Ene 22, 2025, 10:46 PM
Esa versión venia algo incompleta, pero sirve de base. Aun así, tiene mucho curro el adaptar ese código.

Gracias de todos modos por subirlo y respetar créditos de su autor.
#8
Eventos / Re:Evento Clan Dominate
Último mensaje por Swarlog - Ene 22, 2025, 10:45 PM
Gracias por subirlo, se me pasó el subirlo antes  ;)
#9
Eventos / Evento Change of Heart
Último mensaje por Neron - Ene 22, 2025, 08:59 PM
Otro evento perdido que nadie encuentra y ningún otro foro lo tiene. Seguro que más de una comunidad lo pillará de la nuestra  ;D  8)

No es el retail que tiene L2JDevs en java, pero es algo. Éste esta en pyton, está en ruso y es muy antiguo. Espero que os pueda servir.

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

# by minlexx
import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest


qn = "2009004_Change_of_Heart"

WILBERT     = 104

QuestId     = 2009004
QuestName   = "Change_of_Heart"
QuestDesc   = "custom"




# Quest Item
SPIRIT_BEAD = 8766

# Drop chance, win chance need check for correct values
WIN_ROUND_CHANCE = 66

# Reward items

EWS = 959 # Scroll: Enchant Weapon S
EAS = 960 # Scroll: Enchant Armor S
EWA = 729 # Scroll: Enchant Weapon A
EAA = 730 # Scroll: Enchant Armor A
EWB = 947 # Scroll: Enchant Weapon B
EAB = 948 # Scroll: Enchant Armor B
EWC = 951 # Scroll: Enchant Weapon C

BRes = 3936 # Blessed Scroll of Resurrection
BSoE = 1538 # Blessed Scroll of Escape

GHP = 1539 # Greater Healing Potion


class Quest (JQuest) :

 def __init__(self,id,name,descr):
   JQuest.__init__(self,id,name,descr)
   self.questItemIds = []

 def onEvent (self,event,st) :
   htmltext = event
   if event == "Wilbert_IWantToPlay.htm": # quest accepted
     st.setState(State.STARTED)
     st.playSound("ItemSound.quest_accept")
     st.set("cond","1")
     st.set("round","0")
   elif event == "Wilbert_ExitQuest.htm": # quest finished
     st.playSound("ItemSound.quest_finish")
     st.exitQuest(1)
   elif event == "Wilbert_LetsPlay.htm": # "Let's play" pressed
     beads=st.getQuestItemsCount(SPIRIT_BEAD)
     if beads<50:
       htmltext = "Wilbert_Practice_NotEnoughBeads.htm"
     else:
       htmltext = "Wilbert_PlayRound1.htm"
       st.set("round","0")
   elif event == "Wilbert_PullCard.htm": # "Pull first or next card" pressed
     round=st.getInt("round")
     beads=st.getQuestItemsCount(SPIRIT_BEAD)
     if beads<50 and round == 0: # check for 50 beads when game just starts only (round=0)
       htmltext = "Wilbert_Practice_NotEnoughBeads.htm"
     else:
       if round == 0: # take 50 beads when game just starts only (round=0)
         st.takeItems(SPIRIT_BEAD,50)
       random=st.getRandom(100)
       if random>WIN_ROUND_CHANCE: # random value is in range [WIN_ROUND_CHANCE..100]
         htmltext = "Wilbert_PlayLose.htm"
         st.set("round","0") # restart game
       else: # next round won
         round = round + 1
         htmltext = st.showHtmlFile("Wilbert_PlayWin.htm").replace("NROUND", str(round))
         if round == 1:
           htmltext = htmltext.replace("MYPRIZE","10 consumable Potions")
         if round == 2:
           htmltext = htmltext.replace("MYPRIZE","1 Blessed Scroll of Escape")
         if round == 3:
           htmltext = htmltext.replace("MYPRIZE","1 Blessed Scroll of Resurrection")
         if round == 4:
           htmltext = htmltext.replace("MYPRIZE","2 Scroll: Enchant Weapon (Grade C)")
         if round == 5:
           htmltext = htmltext.replace("MYPRIZE","4 Scroll: Enchant Armor (Grade B)")
         if round == 6:
           htmltext = htmltext.replace("MYPRIZE","1 Scroll: Enchant Weapon (Grade B)")
         if round == 7:
           htmltext = htmltext.replace("MYPRIZE","3 Scroll: Enchant Armor (Grade A)")
     if round == 8:
           htmltext = htmltext.replace("MYPRIZE","1 Scroll: Enchant Weapon (Grade A)")
     if round == 9:
           htmltext = htmltext.replace("MYPRIZE","2 Scroll: Enchant Armor (Grade S)")
         if round == 10: # reached round 10; give prizes and restart game
           round = 0
           st.giveItems(EWS,1) # 1 Scroll: Enchant Weapon (Grade S)
           htmltext = "Wilbert_PlayWonRound10.htm"
         st.set("round",str(round))
   elif event == "Wilbert_TakePrize.htm": # player won round and wants to stop game and take prize
     round=st.getInt("round")
     if round == 0: # player did not win any round but wants to take prize? O_o
       htmltext = "<html><body>You did not win any round! No prizes.</body></html>"
       return htmltext
     if round > 10: # some bug or hack?
       st.set("round","0")
       htmltext = "<html><body>Round cannot be > 10 !!!</body></html>"
       return htmltext
     st.set("round","0") # first set round to 0 - game ended.
     htmltext = "Wilbert_PrizeTaken.htm"
     # give prize depending on current round won
     if round == 1:
       st.giveItems(GHP,10) # 10 consumable Potions
     elif round == 2:
       st.giveItems(BSoE,1) # 1 Blessed Scroll of Escape
     elif round == 3:
       st.giveItems(BRes,1) # 1 Blessed Scroll of Resurrection
     elif round == 4:
       st.giveItems(EWC,2) # 2 Scroll: Enchant Weapon (Grade C)
     elif round == 5:
       st.giveItems(EAB,4) # 4 Scroll: Enchant Armor (Grade B)
     elif round == 6:
       st.giveItems(EWB,1) # 1 Scroll: Enchant Weapon (Grade B)
       # B-weap. key number is random
     elif round == 7:
       st.giveItems(EAA,3) # 4 Scroll: Enchant Armor (Grade A)
     elif round == 8:
       st.giveItems(EWA,1) # 1 Scroll: Enchant Weapon (Grade A)
       # B-weap. key number is random
     elif round == 9:
       st.giveItems(EAS,2) # 4 Scroll: Enchant Armor (Grade S)
     # for round 10 prize is automatically when player wins 10 round
   return htmltext


 def onTalk (self,npc,player):
   st = player.getQuestState(qn)
   htmltext = "<html><body>You are either not on a quest that involves this NPC, or you don't meet this NPC's minimum quest requirements.</body></html>"
   if not st : return htmltext
   npcId = npc.getNpcId()
   id = st.getState()
   # first talk to Wilbert
   if npcId == WILBERT and id == State.CREATED:
       if player.getLevel() >= 50 : # check player level
           htmltext = "Wilbert_start.htm"
       else:
           htmltext = "Wilbert_Level.htm"
           st.exitQuest(1)
   # talk to Wilbert when quest already in progress
   elif npcId == WILBERT and id == State.STARTED :
       htmltext = "Wilbert_QuestInProgress.htm"
   return htmltext
 

QUEST = Quest(QuestId,str(QuestId) + "_" + QuestName,QuestDesc)

QUEST.addStartNpc(WILBERT)
QUEST.addTalkId(WILBERT)

print "   INFO Loaded: 2009004_Change_of_Heart"
#10
Eventos / Evento Clan Dominate
Último mensaje por Neron - Ene 22, 2025, 07:39 PM
Dejo este regalito por aquí, que no lo he visto en ningun otro foro.

Lo tenia guardado en una carpeta olvidada. El código es algo antiguo, pero se puede acomodar facilmente y el evento no esta nada mal.

/*
 * 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.l2jdevs.scripts.events;

import java.io.FileNotFoundException;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

import javolution.util.FastList;
import javolution.util.FastMap;

import org.l2jdevs.gameserver.ThreadPoolManager;
import org.l2jdevs.gameserver.datatables.ClanTable;
import org.l2jdevs.gameserver.datatables.NpcTable;
import org.l2jdevs.gameserver.datatables.SkillTable;
import org.l2jdevs.gameserver.datatables.MapRegionTable.TeleportWhereType;
import org.l2jdevs.gameserver.instancemanager.InstanceManager;
import org.l2jdevs.gameserver.model.L2Clan;
import org.l2jdevs.gameserver.model.L2ClanMember;
import org.l2jdevs.gameserver.model.L2Effect;
import org.l2jdevs.gameserver.model.L2Skill;
import org.l2jdevs.gameserver.model.L2World;
import org.l2jdevs.gameserver.model.actor.L2Attackable;
import org.l2jdevs.gameserver.model.actor.L2Playable;
import org.l2jdevs.gameserver.model.actor.L2Character;
import org.l2jdevs.gameserver.model.actor.L2Npc;
import org.l2jdevs.gameserver.model.actor.instance.L2DoorInstance;
import org.l2jdevs.gameserver.model.actor.instance.L2MonsterInstance;
import org.l2jdevs.gameserver.model.actor.instance.L2PcInstance;
import org.l2jdevs.gameserver.model.entity.Instance;
import org.l2jdevs.gameserver.model.quest.Quest;
import org.l2jdevs.gameserver.model.quest.QuestState;
import org.l2jdevs.gameserver.network.SystemMessageId;
import org.l2jdevs.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jdevs.gameserver.network.serverpackets.SystemMessage;
import org.l2jdevs.gameserver.network.serverpackets.UserInfo;
import org.l2jdevs.gameserver.templates.chars.L2NpcTemplate;
import org.l2jdevs.util.Rnd;

public class clandominate extends Quest
{
protected Calendar _eventStart;
protected int _period;
protected int _cycle;
private int[] _redPoints = new int[]{0,0};
private int[] _bluePoints = new int[]{0,0};
private int _maxRed = 4;
private int _maxBlue = 4;
private int _blueReviveDelay = 30000;
private int _redReviveDelay = 30000;
private boolean _eventOn = true;
private Map<L2Clan, Integer> _red = new FastMap<L2Clan, Integer>();
private Map<L2Clan, Integer> _blue = new FastMap<L2Clan, Integer>();
private L2Npc _blueDefender;
private L2Npc _redDefender;
private Map<L2PcInstance,Integer[]> _afkList = new FastMap<L2PcInstance,Integer[]>();
private Map<L2Clan, Integer> _clanQuest = new FastMap<L2Clan, Integer>();
private Instance _eventInstance = null;
// private static final int REWARDVICTORYID = 4676;
private static final int REWARDFAME = 17;
private static final SystemMessage FAME_MESSAGE = new SystemMessage(SystemMessageId.ACQUIRED_S1_REPUTATION_SCORE).addNumber(REWARDFAME);
private static final int REWARDHONORID = 4674;
private static final int EVENTNPC = 90004;
private static final int DEFENDERNPC = 90006;
private static final int MINMOBS = 10000;
private static final int POINTNPC = 90005;
private static final int EVENTLENGTH = 3600000;
// private static final int[] QUESTIDS = {734,735,736,737};
private static final int[] REDUCE_TIME = {0, 30000, 48000, 60000, 66000};
private static final int[] BLUESTARTLOC = {167300,20320,-3338};
private static final int[] REDSTARTLOC = {183800,20320,-3182};
private static final int[][] POINTNPCSLOC = {{175500,20250,-3258},{175500,15240,-3258},
{175500,25440,-3258},{170400,20340,-3258},{180600,20340,-3258}};
protected List<L2Npc> _pointNPCs = new FastList<L2Npc>();
protected ScheduledFuture<?> _eventStartTask = null;
protected ScheduledFuture<?> _eventTask = null;

private void loadData()
{
if (loadGlobalQuestVar("cycle").equalsIgnoreCase(""))
{
_cycle = 1;
_period = 1;
_eventStart = Calendar.getInstance();
_eventStart.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
_eventStart.set(Calendar.HOUR_OF_DAY, 18);
_eventStart.set(Calendar.MINUTE, 0);
_eventStart.set(Calendar.SECOND, 0);
if (_eventStart.getTimeInMillis() < System.currentTimeMillis())
_eventStart.add(Calendar.DAY_OF_MONTH, 7);
saveData();
}
else
{
_cycle = Integer.valueOf(loadGlobalQuestVar("cycle"));
_period = Integer.valueOf(loadGlobalQuestVar("period"));
_redPoints[0] = Integer.valueOf(loadGlobalQuestVar("redPoints"));
_bluePoints[0] = Integer.valueOf(loadGlobalQuestVar("bluePoints"));
_eventStart = Calendar.getInstance();
_eventStart.setTimeInMillis(Long.valueOf(loadGlobalQuestVar("nextStart")));
_eventOn = Boolean.valueOf(loadGlobalQuestVar("eventOn"));

if (_period == 1)
{
for(L2Clan clan : ClanTable.getInstance().getClans())
{
if (!loadGlobalQuestVar(clan.getName()).equalsIgnoreCase(""))
{
String state = loadGlobalQuestVar(clan.getName());
if (Integer.valueOf(state.split(";")[0]) == _cycle && Integer.valueOf(state.split(";")[1]) == 1)
{
_clanQuest.put(clan, Integer.valueOf(state.split(";")[2]));
}
}
}
}
else if (_period >= 2)
{
for(L2Clan clan : ClanTable.getInstance().getClans())
{
if (!loadGlobalQuestVar(clan.getName()).equalsIgnoreCase(""))
{
String state = loadGlobalQuestVar(clan.getName());
if (Integer.valueOf(state.split(";")[0]) == _cycle && Integer.valueOf(state.split(";")[1]) == 2)
{
_blue.put(clan, Integer.valueOf(state.split(";")[2]));
}
else if (Integer.valueOf(state.split(";")[0]) == _cycle && Integer.valueOf(state.split(";")[1]) == 3)
{
_red.put(clan, Integer.valueOf(state.split(";")[2]));
}
}
}
}
}
_log.info("ClanDominate loaded. Next Start: " + _eventStart.getTime());
}

protected void saveData()
{
saveGlobalQuestVar("cycle", String.valueOf(_cycle));
saveGlobalQuestVar("period", String.valueOf(_period));
saveGlobalQuestVar("nextStart", String.valueOf(_eventStart.getTimeInMillis()));
saveGlobalQuestVar("redPoints", String.valueOf(_redPoints[0]));
saveGlobalQuestVar("bluePoints", String.valueOf(_bluePoints[0]));
saveGlobalQuestVar("eventOn", String.valueOf(_eventOn));
if (_period == 1)
for(L2Clan clan : _clanQuest.keySet())
saveGlobalQuestVar(clan.getName(), String.valueOf(_cycle) + ";1;" + String.valueOf(_clanQuest.get(clan)));
else
{
for(L2Clan clan : _blue.keySet())
saveGlobalQuestVar(clan.getName(), String.valueOf(_cycle) + ";2;" + String.valueOf(_blue.get(clan)));
for(L2Clan clan : _red.keySet())
saveGlobalQuestVar(clan.getName(), String.valueOf(_cycle) + ";3;" + String.valueOf(_red.get(clan)));
}
}

private void setPeriod(int val)
{
if (val == _period)
return;
else if (val < _period)
{
_bluePoints[0] = 0;
_redPoints[0] = 0;
_bluePoints[1] = 0;
_redPoints[1] = 0;
_clanQuest.clear();
_blue.clear();
_red.clear();
_cycle++;
}
else if (val == 2)
createTeams();
_period = val;
saveData();
}

public clandominate(int questId, String name, String descr)
{
super(questId, name, descr);

loadData();
if (_eventStart.getTimeInMillis() < System.currentTimeMillis())
{
// server was offline
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) < System.currentTimeMillis())
{
_eventStart.add(Calendar.DAY_OF_MONTH, 7);
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), 16);
}
else
{
// the event period is not over yet
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(new event(0), 16);
}
}
else
{
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), 16);
}
addEventId(EVENTNPC, Quest.QuestEventType.ON_TALK);
addEventId(EVENTNPC, Quest.QuestEventType.ON_FIRST_TALK);
addEventId(POINTNPC, Quest.QuestEventType.ON_FIRST_TALK);
addEventId(POINTNPC, Quest.QuestEventType.ON_TALK);
if (_eventOn)
addSpawn(EVENTNPC, 81920, 148300, -3470, 49152, false, 0);
registerDrops();
this.startQuestTimer("save", 3600000, null, null, true);
}

protected void announce(String text, int type)
{
if (type == 0)
{
for(L2Clan c : _clanQuest.keySet())
{
if (_clanQuest.get(c) >= MINMOBS)
for(L2ClanMember m : c.getMembers())
if (m.getLevel() >= 76 && m.isOnline() && m.getPlayerInstance() != null)
m.getPlayerInstance().sendPacket(new ExShowScreenMessage(text,10000));
}
}
else if (type == 1)
{
for(L2Clan c : _blue.keySet())
for(L2ClanMember m : c.getMembers())
if (m.getLevel() >= 76 && m.isOnline() && m.getPlayerInstance() != null)
m.getPlayerInstance().sendPacket(new ExShowScreenMessage(text,10000));
}
else if (type == 2)
{
for(L2Clan c : _red.keySet())
for(L2ClanMember m : c.getMembers())
if (m.getLevel() >= 76 && m.isOnline() && m.getPlayerInstance() != null)
m.getPlayerInstance().sendPacket(new ExShowScreenMessage(text,10000));
}
}

protected void registerDrops()
{
for (int level =1; level<100; level++)
{
L2NpcTemplate[] templates = NpcTable.getInstance().getAllOfLevel(level);
if ((templates != null) && (templates.length > 0))
{
for (L2NpcTemplate t: templates)
{
try
{
if ( L2Attackable.class.isAssignableFrom(Class.forName("org.l2jdevs.gameserver.model.actor.instance."+t.type+"Instance")))
{
addEventId(t.npcId, Quest.QuestEventType.ON_KILL);
}
}
catch(ClassNotFoundException ex)
{
System.out.println("Class not found "+t.type+"Instance");
}
}
}
}
}

@Override
public String onKill (L2Npc npc, L2PcInstance killer, boolean isPet)
{
if (_eventOn && _period == 1 && npc instanceof L2MonsterInstance && killer != null && npc.getLevel() >= (killer.getLevel() - 8)
&& killer.getClan() != null && _clanQuest.containsKey(killer.getClan()) && _clanQuest.get(killer.getClan()) < MINMOBS)
{
int killed = _clanQuest.get(killer.getClan()) + 1;
_clanQuest.put(killer.getClan(), killed);
if (killed == MINMOBS)
{
saveGlobalQuestVar(killer.getClan().getName(), String.valueOf(_cycle) + ";1;" + String.valueOf(MINMOBS));
killer.getClan().broadcastToOnlineMembers(new ExShowScreenMessage("Your clan pass Magnus the Unicorn's first test!",10000));
}
}
return super.onKill(npc,killer,isPet);
}

@Override
public String onEnterWorld (L2PcInstance player)
{
if (_eventOn && player.getClan() != null && (_blue.containsKey(player.getClan()) || _red.containsKey(player.getClan())) && isAvailable(player, false))
{
if (player.isDead())
{
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) > (System.currentTimeMillis() + 30000))
{
player.setIsPendingRevive(true);
player.sendMessage("You will be re-spawned in 30 seconds.");
this.startQuestTimer("Revive", 30000, null, player);
}
}
else
{
player.sendMessage("You will be ported to the Event in 10 seconds.");
this.startQuestTimer("onEnter", 10000, null, player);
}
}
return null;
}

private void debuff(L2Character character)
{
int lvl = 1;
final L2Effect e = character.getFirstEffect(5660);
if (e != null)
lvl = Math.min(lvl + e.getLevel(), 5);

final L2Skill skill = SkillTable.getInstance().getInfo(5660, lvl);
if (skill != null)
skill.getEffects(character, character);
}

public void teleportPlayer(L2PcInstance player)
{
if (!_eventOn)
return;
QuestState st = player.getQuestState("clandominate");
if (st == null)
st = newQuestState(player);
player.addNotifyQuestOfDeath(st);
if (_blue.containsKey(player.getClan()))
{
player.setTeam(1);
player.setInstanceId(500);
player.teleToLocation(BLUESTARTLOC[0], BLUESTARTLOC[1], BLUESTARTLOC[2], true);
}
else
{
player.setTeam(2);
player.setInstanceId(500);
player.teleToLocation(REDSTARTLOC[0], REDSTARTLOC[1], REDSTARTLOC[2], true);
}
SkillTable.getInstance().getInfo(1323, 1).getEffects(player, player);
}

@Override
public String onDeath(L2Character killer, L2Character victim, QuestState qs)
{
if (_eventOn && victim instanceof L2PcInstance)
{
if (getOnEnterWorld() && victim.getInstanceId() == 500 && ((L2PcInstance)victim).getTeam() > 0)
{
if (((L2PcInstance)victim).getTeam() == 1)
{
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) > (System.currentTimeMillis() + _blueReviveDelay))
{
((L2PcInstance)victim).setIsReviveRequested(1);
victim.setIsPendingRevive(true);
victim.sendMessage("You will be re-spawned in " + _blueReviveDelay/1000 + " seconds.");
this.startQuestTimer("revive", _blueReviveDelay, null, (L2PcInstance) victim);
}
}
else if (((L2PcInstance)victim).getTeam() == 2)
{
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) > (System.currentTimeMillis() + _redReviveDelay))
{
((L2PcInstance)victim).setIsReviveRequested(1);
victim.setIsPendingRevive(true);
victim.sendMessage("You will be re-spawned in " + _redReviveDelay/1000 + " seconds.");
this.startQuestTimer("revive", _redReviveDelay, null, (L2PcInstance) victim);
}
}
((L2PcInstance)victim).setIsParalyzed(false);
}
else
((L2PcInstance)victim).removeNotifyQuestOfDeath(qs);
}
if (_eventOn && victim instanceof L2Playable && killer instanceof L2Playable)
{
L2PcInstance actingVictim = ((L2Playable)victim).getActingPlayer();
L2PcInstance actingKiller = ((L2Playable)killer).getActingPlayer();
if (actingVictim.getTeam() != actingKiller.getTeam())
{
int killCount = 0;
if (_blue.containsKey(actingKiller.getClan()))
{
killCount = _blue.get(actingKiller.getClan()) + 1;
_blue.put(actingKiller.getClan(), killCount);
}
else if (_red.containsKey(actingKiller.getClan()))
{
killCount = _red.get(actingKiller.getClan()) + 1;
_red.put(actingKiller.getClan(), killCount);
}
if (killCount > 0 && killCount < 301 && killCount % 30 == 0)
for(L2PcInstance pl : actingKiller.getClan().getOnlineMembers(0))
if (pl.getInstanceId() == 500 || (pl.isTeleporting() && pl.getLevel() >= 76))
pl.addItem("Quest", REWARDHONORID, 1, pl, true);
}
}
return "";
}

@Override
public String onAdvEvent (String event, L2Npc npc, L2PcInstance player)
{
if (event.equalsIgnoreCase("take"))
{
if (!_clanQuest.containsKey(player.getClan()))
{
_clanQuest.put(player.getClan(), 0);
saveGlobalQuestVar(player.getClan().getName(), String.valueOf(_cycle) + ";1;0");
}
return null;
}
else if (event.equalsIgnoreCase("teamScores"))
{
if (_period != 2)
return null;
String htmltext = "<html><body>Magnus The Unicorn:<br>";
if (player.isGM())
htmltext += _eventStart.getTime() + "<br>";
htmltext += "Blue Team:<br>";
boolean isEventOver = true;
long diff = (System.currentTimeMillis() - _eventStart.getTimeInMillis());
if (diff < EVENTLENGTH && diff > -7200000)
isEventOver = false;
String team = "";
for(L2Clan clan : _blue.keySet())
{
if (isEventOver)
team += clan.getName() + " : " + _blue.get(clan) + "<br>";
else if (team.isEmpty())
team += clan.getName();
else
team += ", " + clan.getName();
}
htmltext += (team + "<br>Red Team:<br>");
team = "";
for(L2Clan clan : _red.keySet())
{
if (isEventOver)
team += clan.getName() + " : " + _red.get(clan) + "<br>";
else if (team.isEmpty())
team += clan.getName();
else
team += ", " + clan.getName();
}
htmltext += team;
htmltext += "</body></html>";
return htmltext;
}
else if (event.equalsIgnoreCase("capture"))
{
if ((player.getTeam() == 1 && !npc.getTitle().equalsIgnoreCase("Blue Team"))
|| (player.getTeam() == 2 && !npc.getTitle().equalsIgnoreCase("Red Team")))
{
for(L2PcInstance p : npc.getKnownList().getKnownPlayersInRadius(900))
if (!p.isDead() && p.getTeam() != player.getTeam())
return "<html><body>Merrow The Unicorn:<br>You can't capture me now!</body></html>";
if (player.getTeam() == 1)
npc.setTitle("Blue Team");
else
npc.setTitle("Red Team");
npc.broadcastStatusUpdate();
return "<html><body>Merrow The Unicorn:<br>I'm surrender!</body></html>";
}
}
else if (event.equalsIgnoreCase("save"))
{
saveData();
return null;
}
else if (event.equalsIgnoreCase("onEnter"))
{
if (player != null && player.isOnline())
teleportPlayer(player);
return null;
}
else if (event.equalsIgnoreCase("turnOn") && player.isGM())
{
_eventOn = true;
saveData();
return null;
}
else if (event.equalsIgnoreCase("turnOff") && player.isGM())
{
_eventOn = false;
saveData();
return null;
}
else if (event.equalsIgnoreCase("defendSpawn"))
{
if (_blueDefender != null)
{
for(L2PcInstance p : _blueDefender.getKnownList().getKnownPlayersInRadius(1200))
if (p.getTeam() == 2 && !p.isDead())
p.setIsParalyzed(true);
if (_blueDefender.getSpawn().getLocx() != _blueDefender.getX()
|| _blueDefender.getSpawn().getLocy() != _blueDefender.getY())
_blueDefender.teleToLocation(_blueDefender.getSpawn().getLocx(), _blueDefender.getSpawn().getLocy(), _blueDefender.getSpawn().getLocz());
}
if (_redDefender != null)
{
for(L2PcInstance p : _redDefender.getKnownList().getKnownPlayersInRadius(1200))
if (p.getTeam() == 1 && !p.isDead())
p.setIsParalyzed(true);
if (_redDefender.getSpawn().getLocx() != _redDefender.getX()
|| _redDefender.getSpawn().getLocy() != _redDefender.getY())
_redDefender.teleToLocation(_redDefender.getSpawn().getLocx(), _redDefender.getSpawn().getLocy(), _redDefender.getSpawn().getLocz());
}
if (_blueDefender != null && _redDefender != null)
startQuestTimer("defendSpawn", 30000, null, null);
}
else if (event.equalsIgnoreCase("revive"))
{
if (player != null && player.isOnline() && player.isDead())
{
player.doRevive();
teleportPlayer(player);
player.setCurrentCp(player.getMaxCp());
player.setCurrentHpMp(player.getMaxHp(), player.getMaxMp());
/*int maxPlayer = (player.getTeam() == 1 ? _maxBlue : _maxRed) + 1;
player.sendMessage("Do not let more than " + maxPlayer + " enemy players near the point NPCs!");*/
}
return null;
}
else if (event.equalsIgnoreCase("givePoints"))
{
int team = 0;
if (npc == null)
{
// error
_log.warning("Clandominate: Cant give points!!! Null npc.");
return null;
}
else if (npc.getTitle().equalsIgnoreCase("Blue Team"))
team = 1;
else if (npc.getTitle().equalsIgnoreCase("Red Team"))
team = 2;
else
{
// error
_log.warning("Clandominate: Cant give points!!! Wrong title.");
return null;
}
int controlledPointNPCs = 0;
for(L2Npc pointNPC : _pointNPCs)
if (pointNPC.getTitle().equalsIgnoreCase(npc.getTitle()))
controlledPointNPCs++;

int sec = 180000;
if (controlledPointNPCs > 0)
{
givePoint2Team(team, controlledPointNPCs);
sec -= REDUCE_TIME[controlledPointNPCs - 1];
}
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) > (System.currentTimeMillis() + sec))
startQuestTimer("givePoints", sec, npc, null);
return null;
}
else if (event.equalsIgnoreCase("calcReviveDelay"))
{
int blue = 0;
int red = 0;
for(L2Clan clan: _blue.keySet())
for(L2ClanMember member :clan.getMembers())
if (member.isOnline() && member.getPlayerInstance().getInstanceId() == 500)
{
member.getPlayerInstance().setFame(member.getPlayerInstance().getFame() + REWARDFAME);
member.getPlayerInstance().sendPacket(FAME_MESSAGE);
member.getPlayerInstance().sendPacket(new UserInfo(member.getPlayerInstance()));
if (!member.getPlayerInstance().isDead() && _afkList.containsKey(member.getPlayerInstance())
&& _afkList.get(member.getPlayerInstance())[0] == member.getPlayerInstance().getX())
{
_afkList.get(member.getPlayerInstance())[1]++;
if (_afkList.get(member.getPlayerInstance())[1] == 3)
{
member.getPlayerInstance().sendPacket(new ExShowScreenMessage("You have 1 min to move!",10000));
}
else if (_afkList.get(member.getPlayerInstance())[1] >= 4)
{
member.getPlayerInstance().setTeam(0);
member.getPlayerInstance().setInstanceId(0);
member.getPlayerInstance().teleToLocation(TeleportWhereType.Town);
}
}
else
{
blue++;
if (!_afkList.containsKey(member.getPlayerInstance()))
_afkList.put(member.getPlayerInstance(), new Integer[2]);
_afkList.get(member.getPlayerInstance())[0] = member.getPlayerInstance().getX();
_afkList.get(member.getPlayerInstance())[1] = 0;
}
}
for(L2Clan clan: _red.keySet())
for(L2ClanMember member :clan.getMembers())
if (member.isOnline() && member.getPlayerInstance().getInstanceId() == 500)
{
member.getPlayerInstance().setFame(member.getPlayerInstance().getFame() + REWARDFAME);
member.getPlayerInstance().sendPacket(FAME_MESSAGE);
member.getPlayerInstance().sendPacket(new UserInfo(member.getPlayerInstance()));
if (!member.getPlayerInstance().isDead() && _afkList.containsKey(member.getPlayerInstance())
&& _afkList.get(member.getPlayerInstance())[0] == member.getPlayerInstance().getX())
{
_afkList.get(member.getPlayerInstance())[1]++;
if (_afkList.get(member.getPlayerInstance())[1] == 3)
{
member.getPlayerInstance().sendPacket(new ExShowScreenMessage("You have 1 min to move!",10000));
}
else if (_afkList.get(member.getPlayerInstance())[1] >= 4)
{
member.getPlayerInstance().setTeam(0);
member.getPlayerInstance().setInstanceId(0);
member.getPlayerInstance().teleToLocation(TeleportWhereType.Town);
}
}
else
{
red++;
if (!_afkList.containsKey(member.getPlayerInstance()))
_afkList.put(member.getPlayerInstance(), new Integer[2]);
_afkList.get(member.getPlayerInstance())[0] = member.getPlayerInstance().getX();
_afkList.get(member.getPlayerInstance())[1] = 0;
}
}
int diffModifier = (blue > 45 || red > 45 ? 200:2000);
if (blue == red)
{
_blueReviveDelay = 30000 - (_redPoints[0] - _bluePoints[0]) * 1500;
_redReviveDelay = 30000 + (_redPoints[0] - _bluePoints[0]) * 1500;
}
else
{
_redReviveDelay = 40000 + (red - blue) * diffModifier + (_redPoints[0] - _bluePoints[0]) * 1500;
_blueReviveDelay = 40000 - (red - blue) * diffModifier - (_redPoints[0] - _bluePoints[0]) * 1500;
if (_blueReviveDelay < 5000)
_blueReviveDelay = 5000;
if (_redReviveDelay > 70000)
_redReviveDelay = 70000;
}
_maxBlue = 8 - _blueReviveDelay / 10000;
_maxRed =  8 - _redReviveDelay / 10000;
if (_maxBlue < 1)
_maxBlue = 1;
else if (_maxRed < 1)
_maxRed = 1;
cancelQuestTimers("calcReviveDelay");
if ((_eventStart.getTimeInMillis() + EVENTLENGTH) > (System.currentTimeMillis() + 60000))
startQuestTimer("calcReviveDelay", 60000, null, null);
return null;
}
return event;
}

private int[] getTeamVariable(int team)
{
if (team == 1)
return _bluePoints;
return _redPoints;
}

private void givePoint2Team(int team, int points)
{
getTeamVariable(team)[0] += points;
switch(getTeamVariable(team)[1])
{
case 0:
if (getTeamVariable(team)[0] >= 10)
{
getTeamVariable(team)[1]++;
for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
if (player.getInstanceId() == 500 && player.getTeam() == team)
{
player.addItem("Quest", REWARDHONORID, 5, player, true);
if (points == _pointNPCs.size() && Rnd.get(100) < 75)
debuff(player);
}
}
break;
case 1:
if (getTeamVariable(team)[0] >= 20)
{
getTeamVariable(team)[1]++;
for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
if (player.getInstanceId() == 500 && player.getTeam() == team)
{
player.addItem("Quest", REWARDHONORID, 5, player, true);
if (points == _pointNPCs.size() && Rnd.get(100) < 75)
debuff(player);
}
}
break;
case 2:
if (getTeamVariable(team)[0] >= 45)
{
getTeamVariable(team)[1]++;
for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
if (player.getInstanceId() == 500 && player.getTeam() == team)
{
player.addItem("Quest", REWARDHONORID, 5, player, true);
if (points == _pointNPCs.size() && Rnd.get(100) < 75)
debuff(player);
}
}
else if (points == _pointNPCs.size())
for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
if (player.getInstanceId() == 500 && player.getTeam() == team)
if (Rnd.get(100) < 75)
debuff(player);
break;
default:
if (points == _pointNPCs.size())
for(L2PcInstance player : L2World.getInstance().getAllPlayers().values())
if (player.getInstanceId() == 500 && player.getTeam() == team)
if (Rnd.get(100) < 75)
debuff(player);
}
}

@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
switch (npc.getNpcId())
{
case EVENTNPC:
QuestState st = player.getQuestState("clandominate");
if (st == null)
st = newQuestState(player);
player.setLastQuestNpcObject(npc.getObjectId());
switch(_period)
{
case 1:
if (player.isGM())
return "90004-10.htm";
else if (player.getClan() == null)
return "90004-00.htm";
else if (_clanQuest.containsKey(player.getClan()) && _clanQuest.get(player.getClan()) >= MINMOBS)
return "90004-03.htm";
else if (_clanQuest.containsKey(player.getClan()))
{
String htmltext = "<html><body>Magnus The Unicorn:<br>Your clan is not ready. Your clan need to kill " + (MINMOBS - _clanQuest.get(player.getClan())) + " more mobs.<br></body></html>";
return htmltext;
}
else if (player.isClanLeader())
return "90004-01.htm";
return "90004-00.htm";
case 2:
long diff = (System.currentTimeMillis() - _eventStart.getTimeInMillis());
if (diff < EVENTLENGTH && diff > -7200000)
{
if (player.isGM())
return "90004-10.htm";
else if (player.getClan() == null)
return "90004-00.htm";
else if (_blue.containsKey(player.getClan()))
return "90004-05b.htm";
else if (_red.containsKey(player.getClan()))
return "90004-05r.htm";
else
return "90004-05f.htm";
}
else
{
if (player.isGM())
return "90004-10.htm";
else if (player.getClan() == null)
return "90004-00.htm";
else if ((_blue.containsKey(player.getClan()) && _bluePoints[0] > _redPoints[0])
|| (_red.containsKey(player.getClan()) && _bluePoints[0] < _redPoints[0]))
return "90004-06w.htm";
else if ((_blue.containsKey(player.getClan()) && _bluePoints[0] < _redPoints[0])
|| (_red.containsKey(player.getClan()) && _bluePoints[0] > _redPoints[0]))
return "90004-06l.htm";
else if ((_blue.containsKey(player.getClan()) || _red.containsKey(player.getClan())) && _bluePoints == _redPoints)
return "90004-06d.htm";
else
return "90004-05f.htm";
}
}
break;
case POINTNPC:
player.setLastQuestNpcObject(npc.getObjectId());
String htmltext = "<html><body>Merrow The Unicorn:<br>The current points of the teams:<br>Blue: " + _bluePoints[0] + "<br>Red: " + _redPoints[0];
if ((player.getTeam() == 1 && !npc.getTitle().equalsIgnoreCase("Blue Team"))
|| (player.getTeam() == 2 && !npc.getTitle().equalsIgnoreCase("Red Team")))
htmltext += "<br><a action=\"bypass -h Quest clandominate capture\">Capture Merrow The Unicorn</a>";
htmltext += "</body></html>";
return htmltext;
}
return null;
}

public static void main(String[] args)
{
new clandominate(-1,"clandominate","custom");
}

protected void cleanEventTasks()
{
if (_eventStartTask != null)
{
_eventStartTask.cancel(false);
_eventStartTask = null;
}
if (_eventTask != null)
{
_eventTask.cancel(false);
_eventTask = null;
}
}

public void createTeams()
{
float redPlayers = 0;
float bluePlayers = 0;
_blue.clear();
_red.clear();
List<L2Clan> clanList = new FastList<L2Clan>();
for(L2Clan c: _clanQuest.keySet())
clanList.add(c);
while (clanList.size() > 0)
{
L2Clan clan = clanList.remove(Rnd.get(clanList.size()));;
if (_clanQuest.get(clan) >= MINMOBS)
{
float membersRating = 0;
for(L2ClanMember cm : clan.getMembers()) {
int mr = cm.getLevel()-75;
if (mr >= 1 && cm.isOnline())
membersRating += mr;
else if (mr >= 1 && !cm.isOnline())
membersRating += (mr / 2);
}
_clanQuest.put(clan, (int) membersRating);
if (Math.abs(redPlayers - bluePlayers) >= 50)
{
if (redPlayers > bluePlayers)
{
_blue.put(clan, 0);
bluePlayers += membersRating;
}
else
{
_red.put(clan, 0);
redPlayers += membersRating;
}
}
else
{
if (Rnd.get(100) < 50)
{
_blue.put(clan, 0);
bluePlayers += membersRating;
}
else
{
_red.put(clan, 0);
redPlayers += membersRating;
}
}
}
}
float ratingDiff = Math.abs(redPlayers-bluePlayers);
if (ratingDiff > 50)
{
if (redPlayers > bluePlayers)
{
Map<L2Clan, Integer> b = GetBalance(_red, (int)ratingDiff);
Remove(_red,b);
_blue.putAll(b);
}
else
{
Map<L2Clan, Integer> b = GetBalance(_blue, (int)ratingDiff);
Remove(_blue,b);
_red.putAll(b);
}
}
_clanQuest.clear();
}

private Map<L2Clan, Integer> GetBalance(Map<L2Clan, Integer> clans, int diff)
{
FastMap<L2Clan, Integer> balanceTeam = new FastMap<L2Clan, Integer>();
int balanceTeamPoint = 0;
int ideal = (diff + 50)/2;
int tempPoint;
int clanPoint;

L2Clan cClan = null;
int cClanPoint = 0;
for(L2Clan c: clans.keySet())
{
clanPoint = _clanQuest.get(c);
if (clanPoint <= ideal && clanPoint > cClanPoint)
{
cClan = c;
cClanPoint = clanPoint;
}
}

if (cClan != null)
{
balanceTeam.put(cClan,cClanPoint);
balanceTeamPoint += cClanPoint;
}

for(L2Clan c: clans.keySet())
{
clanPoint = _clanQuest.get(c);
tempPoint = balanceTeamPoint + clanPoint;
if (tempPoint <= ideal)
{
balanceTeam.put(c,clanPoint);
balanceTeamPoint += clanPoint;
}
}
return balanceTeam;
}

private void Remove(Map<L2Clan, Integer> team, Map<L2Clan, Integer> clans)
{
if (clans == null) return;
if (team == null) return;

for(L2Clan c: clans.keySet())
{
if (team.containsKey(c))
team.remove(c);
}
}

class eventStart implements Runnable
{
public void run()
{
setOnEnterWorld(false);
long remainingTime = _eventStart.getTimeInMillis() - System.currentTimeMillis();
// set period
if (remainingTime > 432000000 || remainingTime <= 300000)
setPeriod(2);
else
setPeriod(1);

if (remainingTime > 432000000)
{
// event is over

cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 432000000);
}
else if (remainingTime > 7200000)
{
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 7200000);
}
else if (remainingTime > 3600000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",0);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 3600000);
}
else if (remainingTime > 1800000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",0);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 1800000);
}
else if (remainingTime > 900000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",0);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 900000);
}
else if (remainingTime > 600000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",0);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 600000);
}
else if (remainingTime > 300000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",0);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 300000);
}
else if (remainingTime > 60000)
{
// announce time
int min = (int) (remainingTime / 60000);
announce("The second test will start in " + min + " minutes.",1);
announce("The second test will start in " + min + " minutes.",2);
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), remainingTime - 60000);
}
else
{
// announce time
announce("The second test will start in " + (remainingTime / 1000) + " seconds.",1);
announce("The second test will start in " + (remainingTime / 1000) + " seconds.",2);
cleanEventTasks();
// StartEvent!
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(new event(0), remainingTime);
cancelQuestTimers("save");
startQuestTimer("save", 600000, null, null, true);
}
}
}

private boolean isAvailable(L2PcInstance player, boolean isReward)
{
if (player.getLevel() < 76 || player.getKarma() != 0 || player.isFlyingMounted())
return false;
if (player.isFestivalParticipant() || player.isInAirShip() || player.isInBoat())
return false;
if (player.isInCraftMode() || player.isInCrystallize() || player.isInDuel())
return false;
if (player.isInJail() || player.isInOlympiadMode() || player.isInStoreMode())
return false;
if (player.isOverloaded() || player.isTeleporting() || player.inObserverMode())
return isReward; // for reward check these are not a problem
return true;
}

class event implements Runnable
{
private int _type;

event(int type)
{
_type = type;
}

public void run()
{
setOnEnterWorld(true);
setPeriod(2);
int remainingTime = (int) (_eventStart.getTimeInMillis() + EVENTLENGTH - System.currentTimeMillis());
if (_type == 0)
{
if (_blue.isEmpty() || _red.isEmpty())
{
// not enough participants :S
_eventStart.add(Calendar.DAY_OF_MONTH, 7);
// clean event
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), 16);
return;
}
// start instance and spawn npcs
try {
InstanceManager.getInstance().createInstanceFromTemplate(500, "ColiseumPvP.xml");
_eventInstance = InstanceManager.getInstance().getInstance(500);
_eventInstance.setDuration(remainingTime);
for (L2DoorInstance door : _eventInstance.getDoors())
door.openMe();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int[] loc : POINTNPCSLOC)
{
L2Npc pointNpc = addSpawn(POINTNPC, loc[0], loc[1], loc[2], 0, false, 0, false, 500);
pointNpc.setTitle("Neutral");
_pointNPCs.add(pointNpc);
}
_blueDefender = addSpawn(DEFENDERNPC, BLUESTARTLOC[0], BLUESTARTLOC[1], BLUESTARTLOC[2], 0, false, 0, false, 500);
_redDefender = addSpawn(DEFENDERNPC, REDSTARTLOC[0], REDSTARTLOC[1], REDSTARTLOC[2], 0, false, 0, false, 500);
_blueDefender.setTitle("Blue Team");
_redDefender.setTitle("Red Team");

for (L2Clan c : _blue.keySet())
{
for (L2ClanMember member : c.getMembers())
{
if (member.isOnline() && isAvailable(member.getPlayerInstance(), false))
teleportPlayer(member.getPlayerInstance());
}
}
for (L2Clan c : _red.keySet())
{
for (L2ClanMember member : c.getMembers())
{
if (member.isOnline() && isAvailable(member.getPlayerInstance(), false))
teleportPlayer(member.getPlayerInstance());
}
}
_afkList.clear();
_blueDefender.disableCoreAI(true);
_redDefender.disableCoreAI(true);
_blueDefender.setIsInvul(true);
_redDefender.setIsInvul(true);
startQuestTimer("defendSpawn", 30000, null, null);
startQuestTimer("givePoints", 150000, _blueDefender, null);
startQuestTimer("givePoints", 150000, _redDefender, null);
startQuestTimer("calcReviveDelay", 1000, null, null);
_type++;
}

if (remainingTime > 0)
{
cleanEventTasks();
_eventTask = ThreadPoolManager.getInstance().scheduleGeneral(new event(_type), remainingTime);
}
else
{
cancelQuestTimers("givePoints");
cancelQuestTimers("defendSpawn");
_blueDefender = null;
_redDefender = null;
_eventStart.add(Calendar.DAY_OF_MONTH, 7);
_eventInstance = null;
for (L2Clan c : _blue.keySet())
{
for (L2ClanMember member : c.getMembers())
{
if (member.isOnline() && !member.getPlayerInstance().isInDuel())
member.getPlayerInstance().setTeam(0);
}
}
for (L2Clan c : _red.keySet())
{
for (L2ClanMember member : c.getMembers())
{
if (member.isOnline() && !member.getPlayerInstance().isInDuel())
member.getPlayerInstance().setTeam(0);
}
}
// clean event
cleanEventTasks();
_eventStartTask = ThreadPoolManager.getInstance().scheduleGeneral(new eventStart(), 16);
cancelQuestTimers("save");
startQuestTimer("save", 3600000, null, null, true);
}
}
}
}