12-23-2011, 01:58 AM
Вот что получилось...
PHP код:
<?php
package l2rt.gameserver.model;
import gnu.trove.map.hash.TIntObjectHashMap;
import l2rt.Config;
import l2rt.gameserver.model.instances.L2MonsterInstance;
import l2rt.gameserver.model.instances.L2NpcInstance;
import l2rt.gameserver.model.instances.L2PetInstance;
import l2rt.gameserver.model.items.L2ItemInstance;
import l2rt.util.GArray;
import l2rt.util.StrTable;
import java.util.logging.Logger;
/**
* Rework ALF
* l2wt.1gb.ua
*/
public class L2ObjectsStorage
{
private static final Logger _log = Logger.getLogger(L2ObjectsStorage.class.getName());
private static long offline_refresh = 0;
private static int offline_count = 0;
private static final TIntObjectHashMap<L2Player> _allPlayers;
private static final TIntObjectHashMap<L2ItemInstance> _allItems;
private static final TIntObjectHashMap<L2NpcInstance> _allNpcs;
private static final TIntObjectHashMap<L2Playable> _allSummons;
private static final TIntObjectHashMap<L2Object> _allOthers;
static
{
_allPlayers = new TIntObjectHashMap<L2Player>();
_allItems = new TIntObjectHashMap<L2ItemInstance>();
_allNpcs = new TIntObjectHashMap<L2NpcInstance>();
_allSummons = new TIntObjectHashMap<L2Playable>();
_allOthers = new TIntObjectHashMap<L2Object>();
}
/**
* Функции которые возвращают массивы элементов карты
**/
public static final L2Player[] getAllPlayersArray()
{
return _allPlayers.values();
}
public static final L2ItemInstance[] getAllItemsArray()
{
return _allItems.values();
}
public static final L2NpcInstance[] getAllNpcArray()
{
return _allNpcs.values();
}
public static final L2Playable[] getAllSummonsArray()
{
return _allSummons.values();
}
public static final L2Object[] getAllOthersArray()
{
return _allOthers.values();
}
/**
* Функции которые возвращают элемент по его ObjId
**/
public static final L2Player getPlayer(int objId)
{
return _allPlayers.get(objId);
}
public static final L2ItemInstance getItem(int objId)
{
return _allItems.get(objId);
}
public static final L2NpcInstance getNpc(int objId)
{
return _allNpcs.get(objId);
}
public static final L2Playable getSummon(int objId)
{
return _allSummons.get(objId);
}
public static final L2Object getOther(int objId)
{
return _allOthers.get(objId);
}
public static L2Player getPlayer(String name)
{
for (L2Player temp : getAllPlayersArray())
if (name.equalsIgnoreCase(temp.getName()))
return temp;
return null;
}
public static L2NpcInstance getNpc(String s)
{
GArray<L2NpcInstance> npcs = new GArray<L2NpcInstance>();
for ( L2NpcInstance temp : getAllNpcArray())
{
if (s.equalsIgnoreCase(temp.getName()))
{
npcs.add(temp);
}
}
if(npcs.size() == 0)
return null;
for(L2NpcInstance temp : npcs)
if(!temp.isDead())
return temp;
return npcs.removeLast();
}
/**
* Функции которые возвращают количество элементов
**/
public static int getAllPlayersCount()
{
return _allPlayers.size();
}
public static int getAllObjectsCount()
{
int result = 0;
result += _allPlayers.size();
result += _allItems.size();
result += _allNpcs.size();
result += _allSummons.size();
result += _allOthers.size();
return result;
}
/**
* Более сложные Функции которые возвращают количество элементов
**/
public static int getAllOfflineCount()
{
if(!Config.SERVICES_OFFLINE_TRADE_ALLOW)
return 0;
long now = System.currentTimeMillis();
if(now > offline_refresh)
{
offline_refresh = now + 10000;
offline_count = 0;
for(L2Player player : getAllPlayersArray())
if(player.isInOfflineMode())
offline_count++;
}
return offline_count;
}
/**
* Функции, связаны с поиском НПЦ по его айди (не путать с ОбжектАйди)
**/
public static L2NpcInstance getByNpcId(int npc_id)
{
L2NpcInstance result = null;
for(L2NpcInstance temp : getAllNpcArray())
if(npc_id == temp.getNpcId())
{
if(!temp.isDead())
return temp;
result = temp;
}
return result;
}
public static GArray<L2NpcInstance> getAllByNpcId(int npc_id, boolean justAlive)
{
GArray<L2NpcInstance> result = new GArray<L2NpcInstance>(0);
for(L2NpcInstance temp : getAllNpcArray())
if(temp.getTemplate() != null && npc_id == temp.getTemplate().getNpcId() && (!justAlive || !temp.isDead()))
result.add(temp);
return result;
}
public static GArray<L2NpcInstance> getAllByNpcId(int[] npc_ids, boolean justAlive)
{
GArray<L2NpcInstance> result = new GArray<L2NpcInstance>(0);
for(L2NpcInstance temp : getAllNpcArray())
if(!justAlive || !temp.isDead())
for(int npc_id : npc_ids)
if(npc_id == temp.getNpcId())
result.add(temp);
return result;
}
public static L2Character getAsCharacter(int storedId)
{
L2Character Result = null;
Result = (L2Character) _allNpcs.get(storedId);
if (Result == null)
Result = (L2Character) _allPlayers.get(storedId);
return Result;
}
public static GArray<Reflection> getAllReflections()
{
GArray<Reflection> result = new GArray<Reflection>();
for(L2Object obj : getAllOthersArray())
if(obj instanceof Reflection)
result.add((Reflection) obj);
return result;
}
/**
* кладет объект в хранилище и возвращает уникальный индентификатор по которому его можно будет найти в хранилище
*/
public static int put(L2Object o)
{
if (o.isItem())
{
_allItems.put(o.getObjectId(), (L2ItemInstance)o);
return o.getObjectId();
}
if (o.isNpc())
{
_allNpcs.put(o.getObjectId(), (L2NpcInstance)o);
return o.getObjectId();
}
if(o.isPlayable())
{
if (o.isPlayer())
{
_allPlayers.put(o.getObjectId(), (L2Player)o);
return o.getObjectId();
}
else
{
_allSummons.put(o.getObjectId(), (L2Playable)o);
return o.getObjectId();
}
}
_allOthers.put(o.getObjectId(), (L2Object)o);
return o.getObjectId();
}
public static long putDummy(L2Object o)
{
return o.getObjectId();
}
public static int getStoredObjectId(int storedId)
{
return storedId;
}
/**
* Функция котораяе удаляет элемент по его ObjId
**/
public static final void remove(L2Object o)
{
if (o.isItem())
{
_allItems.remove(o.getObjectId());
return;
}
if (o.isNpc())
{
_allNpcs.remove(o.getObjectId());
return;
}
if(o.isPlayable())
{
if (o.isPlayer())
{
_allPlayers.remove(o.getObjectId());
return;
}
else
{
_allSummons.remove(o.getObjectId());
return;
}
}
_allOthers.remove(o.getObjectId());
return;
}
}
И в L2Objectа нету больше Long _storedId (соответственно и еще в 100500 местах)
Завтра уже доделаю буду тестить)))