Reward for capture - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Закрытая тема
Опции темы
Непрочитано 30.04.2014, 07:01   #1
Аватар для L2J
Пользователь

Автор темы (Топик Стартер) Reward for capture

Подскажите пожалуйста, почему награда выдается не как прописана 50, а может по несколько раз выдать по 50, и каждому человеку - разное количество награды. Вот код:
package l2p.gameserver.instancemanager;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
 
import gnu.trove.TIntObjectHashMap;
import gnu.trove.TObjectIntHashMap;
import l2p.commons.dbutils.DbUtils;
import l2p.commons.geometry.Circle;
import l2p.commons.lang.reference.HardReference;
import l2p.commons.threading.RunnableImpl;
import l2p.commons.util.Rnd;
import l2p.gameserver.Announcements;
import l2p.gameserver.Config;
import l2p.gameserver.ThreadPoolManager;
import l2p.gameserver.ai.CtrlEvent;
import l2p.gameserver.data.xml.holder.NpcHolder;
import l2p.gameserver.database.DatabaseFactory;
import l2p.gameserver.database.mysql;
import l2p.gameserver.geodata.GeoEngine;
import l2p.gameserver.idfactory.IdFactory;
import l2p.gameserver.listener.actor.OnCurrentHpDamageListener;
import l2p.gameserver.model.*;
import l2p.gameserver.model.instances.AvanpostFlagInstance;
import l2p.gameserver.model.instances.NpcInstance;
import l2p.gameserver.model.instances.MonsterInstance;
import l2p.gameserver.model.pledge.Clan;
import l2p.gameserver.model.reward.RewardItem;
import l2p.gameserver.scripts.Functions;
import l2p.gameserver.serverpackets.Say2;
import l2p.gameserver.serverpackets.components.ChatType;
import l2p.gameserver.serverpackets.components.SystemMsg;
import l2p.gameserver.templates.npc.NpcTemplate;
import l2p.gameserver.utils.Location;
import l2p.gameserver.utils.MultiValueIntegerMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class AvanpostManager
{
    private final Logger _log = LoggerFactory.getLogger(AvanpostManager.class);
 
    private static AvanpostManager _instance;
    public int factionId;
    private TIntObjectHashMap<Avanpost> _avanposts;
 
    public static AvanpostManager getInstance()
    {
        return _instance == null ? (_instance = new AvanpostManager()) : _instance;
    }
 
    public AvanpostManager()
    {
        _avanposts = new TIntObjectHashMap<Avanpost>();
 
        _log.info("[GVE]: Avanpost spawn...");
 
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rset = null;
        try
        {
            con = DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT * FROM gve_avanposts");
            rset = statement.executeQuery();
 
            while (rset.next())
            {
                // создаем флаг
                SimpleSpawner spawn = new SimpleSpawner(rset.getInt("npcId"));
                spawn.setAmount(1);
                spawn.setLoc(new Location(rset.getInt("x"), rset.getInt("y"), rset.getInt("z")));
                spawn.setRespawnDelay(240);
                factionId = rset.getInt("factionId");
 
 
                Avanpost a = new Avanpost(rset.getInt("id"), spawn, rset.getString("name"), rset.getBoolean("capturable"), getFactionId(rset.getInt("factionId")));
 
                a.setFactionId(getFactionId((rset.getInt("factionId"))));
 
                _avanposts.put(rset.getInt("id"), a);
 
                _log.info("[GVE]: Avanpost ID: " + a.ID + ", Faction: " + a.getFactionId());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            DbUtils.closeQuietly(con, statement, rset);
        }
    }
 
 
    public int getFactionId(int factionId)
    {
        return this.factionId;
    }
    public void setFactionId(int i)
    {
        factionId=i;
    }
 
    public Avanpost getAvanpostById(int id)
    {
        return _avanposts.get(id);
    }
 
    public Avanpost[] getAvanposts()
    {
        return _avanposts.getValues(new Avanpost[]{});
    }
 
    public class Avanpost
    {
        private String _name;
        public final int ID;
        private boolean _capturable;
        public final int _factionId;
        private SimpleSpawner _baseSpawn;
        private Map<Player, Integer> rewards = new HashMap<Player, Integer>();
 
        // guards
        private List<SimpleSpawner> _guards;
        public int factionId;
 
        public Avanpost(int id, SimpleSpawner spawn, String name, boolean canCapture, int factionId)
        {
            ID = id;
            _factionId = factionId;
            factionId = getFactionId();
            _name = name;
            _capturable = canCapture;
            _baseSpawn = spawn;
            _baseSpawn.startRespawn();
 
            for(int i = 0; i < _baseSpawn.getAmount(); i++)
            {
                AvanpostFlagInstance flag = (AvanpostFlagInstance)_baseSpawn.doSpawn(true);
                flag.setFactionId(getFactionId());
                flag.setAvanpost(this);
                flag.setTitle("Аванпост " + getName());
            }
 
            ThreadPoolManager.getInstance().schedule(new Runnable()
            {
                @Override
                public void run()
                {
                    // спавним охрану
                    spawnGuards();
                }
            }, 1000);
        }
 
        public void spawnGuards()
        {
            // уже есть гварды
            if(_guards != null)
            {
                for(SimpleSpawner spawn : _guards)
                {
                    spawn.stopRespawn();
 
                    for(NpcInstance npc : spawn.getAllSpawned())
                    {
                        npc.deleteMe();
                    }
                }
 
                _guards = null;
            }
 
            _guards = new ArrayList<SimpleSpawner>(4);
 
            int zMin = GeoEngine.getHeight(_baseSpawn.getLoc(), _baseSpawn.getReflection().getGeoIndex()) - 50;
            int zMax = zMin + 150;
 
            if(getFactionId() != 0)
            {
                SimpleSpawner fighter = new SimpleSpawner(factionId == 1 ? 36609 : 36611);
                fighter.setAmount(3);
                fighter.setTerritory(new Territory().add(new Circle(_baseSpawn.getLoc(), 400).setZmin(zMin).setZmax(zMax)));
                fighter.setRespawnTime(0);
                fighter.setRespawnDelay(60);
                fighter.startRespawn();
                fighter.init();
                _guards.add(fighter);
 
                SimpleSpawner arch = new SimpleSpawner(factionId == 1 ? 36608 : 36610);
                arch.setAmount(4);
                arch.setTerritory(new Territory().add(new Circle(_baseSpawn.getLoc(), 400).setZmin(zMin).setZmax(zMax)));
                arch.setRespawnTime(0);
                arch.setRespawnDelay(60);
                arch.startRespawn();
                arch.init();
                _guards.add(arch);
            }
        }
 
        public String getName()
        {
            return _name;
        }
 
        public boolean isCapturable()
        {
            return _capturable;
        }
 
        public Location getLocation()
        {
            return _baseSpawn.getLoc();
        }
 
 
        public int getFactionId()
        {
            return this.factionId;
        }
        public void setFactionId(int i)
        {
            factionId=i;
        }
 
        public boolean canTeleport(Player player)
        {
            return getFactionId() == player.getFactionId();
        }
 
        private long _nextAttackNotify;
 
 
        public void onEvtAttacked(Creature attacker, int damage)
        {
            long temp = System.currentTimeMillis();
            if(_nextAttackNotify <= temp)
            {
                _nextAttackNotify = temp + (60 * 2 * 1000);
                if(attacker.getFactionId() == 1)
                {
                    Announcements.getInstance().announceToAll("Аванпост " + getName() + " был атакован фракцией добра.");
                }
                if(attacker.getFactionId() == 2)
                {
                    Announcements.getInstance().announceToAll("Аванпост " + getName() + " был атакован фракцией зла.");
                }
            }
 
            //Добавляем игрока и его урон складываем с предыдущем значением
            if (rewards.get(attacker.getPlayer()) != null) {
                rewards.put(attacker.getPlayer(), rewards.get(attacker.getPlayer()) + damage);
            }
            else
            {
                rewards.put(attacker.getPlayer(), damage);
            }
 
            for (NpcInstance flag : _baseSpawn.getAllSpawned())
            {
                for (NpcInstance npc : flag.getAroundNpc(1000, 200))
                {
                    if(npc.isDead())
                        continue;
                    if(npc.getFactionId() == flag.getFactionId())
                    {
                        npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, attacker, damage);
                    }
                }
            }
 
        }
        public void onEvtDead(Creature killer)
        {
            Player player = killer.getPlayer();
 
            if(player == null)
                return;
 
 
            {
                StringBuilder sb = new StringBuilder();
 
                sb.append("Аванпост ").append(getName()).append(" был ");
 
                if(_capturable)
                {
                    sb.append("захвачен");
                    if(player.getFactionId() == 1)
                    {
                        sb.append(" фракцией добра.");
                    }
                    else if(player.getFactionId() == 2)
                    {
                        sb.append(" фракцией зла.");
                    }
                }
                else
                {
                    sb.append("уничтожен.");
                }
 
                if(!_capturable)
                {
                    sb.append(" Начаты восстановительные работы!");
                }
 
                Player[] attackers = rewards.keySet().toArray(new Player[rewards.size()]);
                for(Player attacker : attackers)
                {
 
                    for (Map.Entry<Player, Integer> entry : rewards.entrySet())
                    {
                        attacker.getInventory().addItem(22335, 50);
                        attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE);
                        attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE_AND_GET_REWARD);
                    }
                    rewards.remove(attacker);
                }
                rewards.clear();
 
 
 
                Announcements.getInstance().announceToAll(sb.toString());
            }
 
            if(_capturable)
            {
                factionId = player.getFactionId();
                mysql.set("UPDATE `gve_avanposts` SET `factionId` = " + factionId + " WHERE `id` = " + ID);
                ThreadPoolManager.getInstance().schedule(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        // спавним охрану
                        spawnGuards();
                    }
                }, 2000);
            }
        }
 
 
    }
}
Code: Java
L2J вне форума
Непрочитано 30.04.2014, 08:20   #2
Пользователь

По умолчанию Re: Reward for capture

PHP код:
for (Map.Entry<PlayerIntegerentry rewards.entrySet())
                    {
                        
attacker.getInventory().addItem(2233550);
                        
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE);
                        
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE_AND_GET_REWARD);
                    } 
Потому что при переборе списка rewards награда почему то выдается всегда attacker в цикле.
Какие должны быть правила выдачи награды?
flopix вне форума
Непрочитано 30.04.2014, 19:22   #3
Аватар для L2J
Пользователь

Автор темы (Топик Стартер) Re: Reward for capture

Должно выдаваться 1 раз каждому атакующему человеку.
L2J вне форума
Непрочитано 30.04.2014, 21:28   #4
Пользователь

По умолчанию Re: Reward for capture

Если каждому атакующему без учета сколько именно он нанес урона то так:

PHP код:
                Player[] attackers rewards.keySet().toArray(new Player[rewards.size()]);
                for(
Player attacker attackers)
                {
                     
attacker.getInventory().addItem(2233550);
                     
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE);
                     
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE_AND_GET_REWARD);
                }
                
rewards.clear(); 
flopix вне форума
Сказали спасибо:
Непрочитано 30.04.2014, 22:07   #5
Аватар для L2J
Пользователь

Автор темы (Топик Стартер) Re: Reward for capture

Спасибо, все так как надо.
L2J вне форума
Непрочитано 02.05.2014, 15:57   #6
Аватар для Ashe
Олдфаг

По умолчанию Re: Reward for capture

Вопрос решён. Тема закрыта.
__________________
Fortuna - non penis, in manus non recipe.
Ashe вне форума
Закрытая тема


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помощь] Редактирование квестов timki Aion 1 25.02.2013 11:58
Guild Wars 2 [STIGMATED] Другие игры / Other games 25 12.11.2012 15:36
[Core] Наработки surfacing Работа со скриптами 140 15.08.2011 11:57
Эвенты на l2jTeon mr.Z Lineage II 0 18.07.2010 07:10
Адаптируем SQL BimBom Работа со скриптами 9 14.10.2009 15:14


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 07:40. Часовой пояс GMT +3.

Вверх