Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Reward for capture
#1
Подскажите пожалуйста, почему награда выдается не как прописана 50, а может по несколько раз выдать по 50, и каждому человеку - разное количество награды. Вот код:
[SRC="java"]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);
}
}


}
}[/SRC]
#2
PHP код:
<?php 
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 награда почему то выдается всегда attacker в цикле.
Какие должны быть правила выдачи награды?
#3
Должно выдаваться 1 раз каждому атакующему человеку.
#4
Если каждому атакующему без учета сколько именно он нанес урона то так:

PHP код:
<?php 
Player
[] attackers = rewards.keySet().toArray(new Player[rewards.size()]);
for(
Player attacker : attackers)
{
attacker.getInventory().addItem(22335, 50);
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE);
attacker.sendPacket(SystemMsg.YOU_ARE_CAPTURE_AND_GET_REWARD);
}
rewards.clear();
#5
Спасибо, все так как надо.
#6
Вопрос решён. Тема закрыта.
Fortuna - non penis, in manus non recipe.


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)