本文整理汇总了C++中Zone::getObjectRegistry方法的典型用法代码示例。如果您正苦于以下问题:C++ Zone::getObjectRegistry方法的具体用法?C++ Zone::getObjectRegistry怎么用?C++ Zone::getObjectRegistry使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Zone
的用法示例。
在下文中一共展示了Zone::getObjectRegistry方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: execute
//.........这里部分代码省略.........
for (int i=0; i<m_MaskNum[grade]; i++)
{
POINT& pt = m_IceFieldMask[grade][i];
int tileX = X+pt.x;
int tileY = Y+pt.y;
if (rect.ptInRect(tileX, tileY))
{
Tile& tile = pZone->getTile(tileX, tileY);
if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) ) continue;
// 현재 타일에다 이펙트를 추가할 수 있다면...
if (tile.canAddEffect())
{
// 같은 effect가 있으면 지운다.
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ICE_FIELD);
if (pOldEffect != NULL)
{
ObjectID_t effectID = pOldEffect->getObjectID();
pZone->deleteEffect(effectID);// fix me
}
// 이펙트 클래스를 생성한다.
EffectIceField* pEffect = new EffectIceField(pZone , tileX, tileY);
pEffect->setCasterName(pOusters->getName());
pEffect->setCasterID(pOusters->getObjectID());
pEffect->setDeadline(output.Duration);
pEffect->setDuration(output.Range);
pEffect->setNextTime(0);
pEffect->setTick(output.Tick);
// Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다.
ObjectRegistry & objectregister = pZone->getObjectRegistry();
objectregister.registerObject(pEffect);
pZone->addEffect(pEffect);
tile.addEffect(pEffect);
const list<Object*>& oList = tile.getObjectList();
for(list<Object*>::const_iterator itr = oList.begin(); itr != oList.end(); itr++)
{
Object* pTarget = *itr;
Creature* pTargetCreature = NULL;
if (pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE
&& ((pTargetCreature = dynamic_cast<Creature*>(pTarget))->isSlayer() || pTargetCreature->isVampire() )
&& !checkZoneLevelToHitTarget(pTargetCreature )
)
{
cList.push_back(pTargetCreature);
_GCSkillToTileOK2.addCListElement(pTargetCreature->getObjectID());
_GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID());
_GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID());
pEffect->affect(pTargetCreature);
}
// pEffect->affect(pTarget);
}
}
}
}
_GCSkillToTileOK1.setSkillType(SkillType);
_GCSkillToTileOK1.setCEffectID(CEffectID);
_GCSkillToTileOK1.setX(X);
_GCSkillToTileOK1.setY(Y);
_GCSkillToTileOK1.setDuration(output.Duration);
示例2: execute
//////////////////////////////////////////////////////////////////////////////
// 몬스터 셀프 핸들러
//////////////////////////////////////////////////////////////////////////////
void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y)
throw(Error)
{
__BEGIN_TRY
//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl;
Assert(pMonster != NULL);
try
{
Zone* pZone = pMonster->getZone();
Assert(pZone != NULL);
GCSkillToTileOK2 _GCSkillToTileOK2;
GCSkillToTileOK3 _GCSkillToTileOK3;
GCSkillToTileOK4 _GCSkillToTileOK4;
GCSkillToTileOK5 _GCSkillToTileOK5;
GCSkillToTileOK6 _GCSkillToTileOK6;
SkillType_t SkillType = SKILL_BLOODY_WALL;
SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);
ZoneCoord_t myX = pMonster->getX();
ZoneCoord_t myY = pMonster->getY();
// 마스터는 무조건~~
bool bRangeCheck = pMonster->isMaster()
#ifdef __UNDERWORLD__
|| pMonster->isUnderworld() || pMonster->getMonsterType() == 599
#endif
|| verifyDistance(pMonster, X, Y, pSkillInfo->getRange());
bool bHitRoll = pMonster->isMaster()
#ifdef __UNDERWORLD__
|| pMonster->isUnderworld() || pMonster->getMonsterType() == 599
#endif
|| HitRoll::isSuccessMagic(pMonster, pSkillInfo);
bool bTileCheck = false;
VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1);
if (rect.ptInRect(X, Y)) bTileCheck = true;
if (bRangeCheck && bHitRoll && bTileCheck)
{
// 이펙트의 지속시간을 계산한다.
SkillInput input(pMonster);
SkillOutput output;
computeOutput(input, output);
//Range_t Range = 3;
Dir_t Dir = getDirectionToPosition(myX, myY, X, Y);
list<Creature*> cList; // denier list
for (int i=0; i<5; i++)
{
POINT& pt = m_BloodyWallMask[Dir][i];
int tileX = X+pt.x;
int tileY = Y+pt.y;
if (rect.ptInRect(tileX, tileY))
{
Tile& tile = pZone->getTile(tileX, tileY);
// 현재 타일에다 이펙트를 추가할 수 있다면...
if (tile.canAddEffect())
{
// 같은 effect가 있으면 지운다.
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL);
if (pOldEffect != NULL)
{
ObjectID_t effectID = pOldEffect->getObjectID();
pZone->deleteEffect(effectID);// fix me
}
// 이펙트 클래스를 생성한다.
EffectBloodyWall* pEffect = new EffectBloodyWall(pZone , tileX, tileY);
pEffect->setCasterName(pMonster->getName());
pEffect->setCasterID(pMonster->getObjectID());
pEffect->setClan(Creature::CREATURE_CLASS_MONSTER, pMonster->getClanType());
pEffect->setDamage(output.Damage);
pEffect->setDeadline(output.Duration);
pEffect->setLevel(pMonster->getINT());
pEffect->setNextTime(0);
pEffect->setTick(output.Tick);
// Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다.
ObjectRegistry & objectregister = pZone->getObjectRegistry();
objectregister.registerObject(pEffect);
pZone->addEffect(pEffect);
tile.addEffect(pEffect);
GCAddEffectToTile gcAE;
//.........这里部分代码省略.........
示例3: execute
//.........这里部分代码省略.........
{
// 루아의 계산 결과를 받아 아이템을 생성한다.
pLuaSelectItem->prepare();
int result = pLuaSelectItem->executeFile(luaFileName);
LuaState::logError(result);
pLuaSelectItem->clear();
}
Timeval afterTime;
getCurrentTime(afterTime);
cout << "luaExecute time before : " << beforeTime.tv_sec << "." << beforeTime.tv_usec << endl;
cout << "luaExecute time after : " << afterTime.tv_sec << "." << afterTime.tv_usec << endl;
*/
//--------------------------------------------------------
// 루아의 계산 결과를 받아 아이템을 생성한다.
pLuaSelectItem->prepare();
int result = pLuaSelectItem->executeFile(luaFileName);
LuaState::logError(result);
ItemClass = pLuaSelectItem->getItemClass();
ItemType = pLuaSelectItem->getItemType();
OptionType = pLuaSelectItem->getOptionType();
pLuaSelectItem->clear();
if(ItemClass >= Item::ITEM_CLASS_MAX )
//|| ItemType >= ITEM_TYPE_MAX || ItemType < 0
// || OptionType == 0)
{
filelog("XMasEventError.txt", "[ ItemInfo Error ] : ItemClass = %d , ItemType = %d , OptionType = %d", ItemClass, ItemType, OptionType);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
return;
}
// 클라이언트에 선물상자를 지우도록 한다.
GCDeleteInventoryItem gcDeleteInventoryItem;
gcDeleteInventoryItem.setObjectID(pGiftBoxItem->getObjectID());
pPlayer->sendPacket(&gcDeleteInventoryItem);
// 선물상자를 지운다.
pInventory->deleteItem(X, Y);
// ItemTraceLog 를 남긴다
if (pGiftBoxItem != NULL && pGiftBoxItem->isTraceItem() )
{
remainTraceLog(pGiftBoxItem, pCreature2->getName(), pCreature1->getName(), ITEM_LOG_DELETE, DETAIL_EVENTNPC);
}
pGiftBoxItem->destroy();
SAFE_DELETE(pGiftBoxItem);
// 선물(Item)을 만든다.
list<OptionType_t> optionTypeList;
if (OptionType != 0 )
optionTypeList.push_back(OptionType);
pItem = g_pItemFactoryManager->createItem(ItemClass, ItemType, optionTypeList);
Assert(pItem != NULL);
// 선물을 인벤토리에 추가한다.
pZone->getObjectRegistry().registerObject(pItem);
pInventory->addItem(X, Y, pItem);
pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, X, Y);
// ItemTraceLog 를 남긴다
if (pItem != NULL && pItem->isTraceItem() )
{
remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC);
}
// 클라이언트에 선물이 추가되었음을 알린다.
GCCreateItem gcCreateItem;
makeGCCreateItem(&gcCreateItem, pItem, X, Y);
pPlayer->sendPacket(&gcCreateItem);
// Flag을 켠다.
pFlagSet->turnOn(FLAGSET_TRADE_GIFT_BOX_2002_12);
// Flag을 저장한다.
pFlagSet->save(pPC->getName());
// 아이템 교환이 이루어 졌다고 클라이언트에 알린다.
GCNPCResponse response;
response.setCode(NPC_RESPONSE_TRADE_GIFT_BOX_OK);
pPlayer->sendPacket(&response);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
__END_CATCH
}
示例4: execute
void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, SkillSlot* pSkillSlot)
throw(Error)
{
__BEGIN_TRY
Assert(pSlayer != NULL);
Assert(pSkillSlot != NULL);
try
{
Player* pPlayer = pSlayer->getPlayer();
Zone* pZone = pSlayer->getZone();
Assert(pPlayer != NULL);
Assert(pZone != NULL);
GCSkillToInventoryOK1 _GCSkillToInventoryOK1;
// GCSkillToTileOK1 _GCSkillToTileOK1;
// GCSkillToTileOK5 _GCSkillToTileOK5;
SkillType_t SkillType = pSkillSlot->getSkillType();
SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);
SkillLevel_t SkillLevel = pSkillSlot->getExpLevel();
// 명중률.
//ToHit_t ToHit = pSlayer->getToHit();
int RequiredMP = (int)pSkillInfo->getConsumeMP();
bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP);
bool bTimeCheck = verifyRunTime(pSkillSlot);
bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer);
ZoneCoord_t slayerX = pSlayer->getX(), slayerY = pSlayer->getY();
bool bInstallAction = false;
Mine* pMine = NULL;
Inventory * pInventory = pSlayer->getInventory();
Assert(pInventory != NULL);
if(bManaCheck && bTimeCheck &&bRangeCheck ) {
// mine을 찾는다.
Item* pItem = pInventory->getItem(X, Y);
if(pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_MINE)
{
bInstallAction = true;
pMine = dynamic_cast<Mine*>(pItem);
}
}
// 기술의 성패를 따진다.
if (bInstallAction )
{
//Range_t Range = 1;
GCSkillToInventoryOK1 _GCSkillToInventoryOK1;
// GCSkillToInventoryOK5 _GCSkillToInventoryOK5;
ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(Item::ITEM_CLASS_MINE, pMine->getItemType());
Damage_t MinDamage = pItemInfo->getMinDamage();
Damage_t MaxDamage = pItemInfo->getMaxDamage();
Damage_t RealDamage = MinDamage + (max (0, ((int)MaxDamage * (int)SkillLevel / 100 ) - MinDamage ));
Mine * pInstallMine = new Mine();
ObjectRegistry& OR = pZone->getObjectRegistry();
OR.registerObject(pInstallMine);
Assert(pInstallMine != NULL);
pInstallMine->setItemType(pMine->getItemType());
pInstallMine->setDir(TargetX);
pInstallMine->setDamage(RealDamage);
pInstallMine->setInstallerName(pSlayer->getName());
pInstallMine->setInstallerPartyID(pSlayer->getPartyID());
pInstallMine->setFlag(Effect::EFFECT_CLASS_INSTALL);
// 아이템 사라지는게 3분인거 때문에 지뢰도 사라졌는데..
// 10분으로 고정. by sigi. 2002.11.3
TPOINT pt = pZone->addItem(pInstallMine, slayerX, slayerY, true, 6000);
// EXP up
Exp_t Point = pSkillInfo->getPoint();
shareAttrExp(pSlayer, 100, 1, 8, 1, _GCSkillToInventoryOK1);
increaseDomainExp(pSlayer, SKILL_DOMAIN_GUN, Point, _GCSkillToInventoryOK1);
increaseSkillExp(pSlayer, SKILL_DOMAIN_GUN, pSkillSlot, pSkillInfo, _GCSkillToInventoryOK1);
decreaseMana(pSlayer, RequiredMP, _GCSkillToInventoryOK1);
decreaseItemNum(pMine, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, X, Y);
_GCSkillToInventoryOK1.setObjectID(pInstallMine->getObjectID());
_GCSkillToInventoryOK1.setSkillType(SkillType);
_GCSkillToInventoryOK1.setCEffectID(0);
_GCSkillToInventoryOK1.setX(X);
_GCSkillToInventoryOK1.setY(Y);
_GCSkillToInventoryOK1.setDuration(0);
/*
//.........这里部分代码省略.........
示例5: execute
//////////////////////////////////////////////////////////////////////////////
// 슬레이어 타일 핸들러
//////////////////////////////////////////////////////////////////////////////
void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID)
throw(Error)
{
__BEGIN_TRY
//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl;
Assert(pSlayer != NULL);
Assert(pSkillSlot != NULL);
try
{
Player* pPlayer = pSlayer->getPlayer();
Zone* pZone = pSlayer->getZone();
Assert(pPlayer != NULL);
Assert(pZone != NULL);
GCSkillToTileOK1 _GCSkillToTileOK1;
GCSkillToTileOK2 _GCSkillToTileOK2;
GCSkillToTileOK3 _GCSkillToTileOK3;
GCSkillToTileOK4 _GCSkillToTileOK4;
GCSkillToTileOK5 _GCSkillToTileOK5;
GCSkillToTileOK6 _GCSkillToTileOK6;
SkillType_t SkillType = pSkillSlot->getSkillType();
SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);
ZoneCoord_t myX = pSlayer->getX();
ZoneCoord_t myY = pSlayer->getY();
int RequiredMP = (int)pSkillInfo->getConsumeMP();
bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP);
bool bTimeCheck = verifyRunTime(pSkillSlot);
bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()) && checkZoneLevelToUseSkill(pSlayer);
bool bHitRoll = HitRoll::isSuccessMagicElusion(pSlayer);
bool bTileCheck = false;
VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1);
if (rect.ptInRect(X, Y)) bTileCheck = true;
// 이펙트의 지속시간을 계산한다.
SkillInput input(pSlayer, pSkillSlot);
SkillOutput output;
computeOutput(input, output);
if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck)
{
decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1);
Range_t Range = 2;
int oX, oY;
list<Creature*> cList; // denier list
ObjectRegistry & objectregister = pZone->getObjectRegistry();
// 일단 이미 sanctuary가 있는지 검색한다.
for(oY = -1; oY <= 1; oY++)
for(oX = -1; oX <= 1; oX++)
{
int tileX = X+oX;
int tileY = Y+oY;
if (rect.ptInRect(tileX, tileY))
{
Tile& tile = pZone->getTile(tileX, tileY);
if (tile.canAddEffect())
{
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_MAGIC_ELUSION);
// 이미 있다면
// 기술 실패다.
if (pOldEffect != NULL)
{
executeSkillFailNormal(pSlayer, getSkillType(), NULL);
return;
}
}
else
{
executeSkillFailNormal(pSlayer, getSkillType(), NULL);
return;
}
}
}
for(oY = -1; oY <= 1; oY++)
for(oX = -1; oX <= 1; oX++)
{
int tileX = X+oX;
int tileY = Y+oY;
if (rect.ptInRect(tileX, tileY))
{
//.........这里部分代码省略.........
示例6: execute
//.........这里部分代码省略.........
char pField[80];
sprintf(pField, "Storage=%d, StorageID=%u, X=%d, Y=%d", STORAGE_INVENTORY, invenID, InvenX, InvenY);
pItem->tinysave(pField);
Success = true;
}
if (Success) {
TradeManager* pTradeManager = pZone->getTradeManager();
TradeInfo* pInfo = pTradeManager->getTradeInfo(pCreature->getName());
if (pInfo != NULL && pInfo->getStatus() == TRADE_FINISH) {
GCTradeVerify gcTradeVerify;
gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MOUSE_TO_INVENTORY_OK);
pPlayer->sendPacket(&gcTradeVerify);
}
// 트리 조각일 경우
if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_EVENT_TREE) {
ItemType_t itemtype = pItem->getItemType();
// 크리스마스 트리 조각이면
if (itemtype <= 11) {
// 크리스마스 트리 조각이 맞춰지는지 본다.
TPOINT pt = checkEventPuzzle(pPC, InvenX, InvenY, 0);
if (pt.x != -1 && pt.y != -1 )
{
// 맞춰진 트리 조각을 지운다.
deleteInventoryItem(pInventory, pt.x, pt.y, pt.x + 2, pt.y + 3);
// 트리를 생성한다.
list<OptionType_t> optionType;
Item* pTreeItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 12, optionType);
pZone->getObjectRegistry().registerObject(pTreeItem);
pInventory->addItem(pt.x, pt.y, pTreeItem);
pTreeItem->create(pPC->getName(), STORAGE_INVENTORY, invenID, pt.x, pt.y);
// 클라이언트에 트리가 만들어졌다는 걸 알린다.
GCCreateItem gcCreateItem;
makeGCCreateItem(&gcCreateItem, pTreeItem, pt.x, pt.y);
pGamePlayer->sendPacket(&gcCreateItem);
}
}
// 크리스마스 트리 조각이면
else if (itemtype > 12 && itemtype <= 24) {
// 크리스마스 트리 조각이 맞춰지는지 본다.
TPOINT pt = checkEventPuzzle(pPC, InvenX, InvenY, 13);
if (pt.x != -1 && pt.y != -1) {
// 맞춰진 트리 조각을 지운다.
deleteInventoryItem(pInventory, pt.x, pt.y, pt.x + 2, pt.y + 3);
// 트리를 생성한다.
list<OptionType_t> optionType;
Item* pTreeItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 25, optionType);
pTreeItem->setQuestItem();
pZone->getObjectRegistry().registerObject(pTreeItem);
pInventory->addItem(pt.x, pt.y, pTreeItem);
pTreeItem->create(pPC->getName(), STORAGE_INVENTORY, invenID, pt.x, pt.y);
// 클라이언트에 트리가 만들어졌다는 걸 알린다.
GCCreateItem gcCreateItem;
makeGCCreateItem(&gcCreateItem, pTreeItem, pt.x, pt.y);
pGamePlayer->sendPacket(&gcCreateItem);
}
}
// 크리스마스 트리 조각이면
示例7: execute
//.........这里部分代码省略.........
return;
}
pInventory->deleteItem(pItem->getObjectID());
pPC->addItemToExtraInventorySlot(pItem);
//pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0);
// item저장 최적화. by sigi. 2002.5.13
char pField[80];
sprintf(pField, "Storage=%d, StorageID=0", STORAGE_EXTRASLOT);
pItem->tinysave(pField);
TradeManager* pTradeManager = pZone->getTradeManager();
TradeInfo* pInfo = pTradeManager->getTradeInfo(pCreature->getName());
if (pInfo != NULL && pInfo->getStatus() == TRADE_FINISH)
{
GCTradeVerify gcTradeVerify;
gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_INVENTORY_TO_MOUSE_OK);
pPlayer->sendPacket(&gcTradeVerify);
}
}
// 겹치는 아이템 분리하기 루틴
else
{
// 겹치는 아이템이 아니거나, 현재 숫자가 2 미만이라면 분리할 수 없다.
if (!isStackable(pItem) || pItem->getNum() < 2
|| (pItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 2 && pItem->getNum() == 99)
|| pPC->getStore()->hasItem(pItem)
)
{
GCCannotAdd _GCCannotAdd;
_GCCannotAdd.setObjectID(pPacket->getObjectID());
pPlayer->sendPacket(&_GCCannotAdd);
return;
}
// 기존의 아이템을 바탕으로 같은 아이템을 생성한다.
Item::ItemClass IClass = pItem->getItemClass();
ItemType_t IType = pItem->getItemType();
const list<OptionType_t>& OType = pItem->getOptionTypeList();
Item* pNewItem = g_pItemFactoryManager->createItem(IClass, IType, OType);
Assert(pNewItem != NULL);
// 마우스에다 더할 아이템은 기존의 OID를 가져가고,
// 인벤토리에 남을 아이템은 새로운 OID를 받아야 한다.
Zone* pZone = pPC->getZone();
Assert(pZone != NULL);
ObjectRegistry& OR = pZone->getObjectRegistry();
OR.registerObject(pNewItem);
// 인벤토리에 남아있는 아이템의 숫자는 원래 숫자에서 1을 뺀 숫자가 된다.
// 기존의 아이템은 마우스로 옮겨졌으므로, 숫자가 1이 된다.
// 인벤토리에서 마우스로 옮겨진 아이템을 삭제하고,
// 새로 생성된 아이템을 더한다.
pInventory->deleteItem(pItem->getObjectID());
pPC->addItemToExtraInventorySlot(pItem);
int NewNum = pItem->getNum() - 1;
pNewItem->setNum(NewNum);
pItem->setNum(1);
pInventory->addItem(InvenX, InvenY, pNewItem);
// 달라진 위치 정보를 세이브한다...
//pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0);
// item저장 최적화. by sigi. 2002.5.13
char pField[80];
sprintf(pField, "Num=%d, Storage=%d, StorageID=0", 1, STORAGE_EXTRASLOT);
pItem->tinysave(pField);
pNewItem->create(pPC->getName(), STORAGE_INVENTORY, invenID, InvenX, InvenY);
//pNewItem->setNum(NewNum); // 위에서 했는데 또 하네. -_-;
//pNewItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);
// item저장 최적화. by sigi. 2002.5.13
sprintf(pField, "Num=%d, Storage=%d, StorageID=%u", NewNum, STORAGE_INVENTORY, invenID);
pNewItem->tinysave(pField);
// 클라이언트에게는 GCCreateItem 패킷을 이용해
// 인벤토리에 새로이(?) 생성된 아이템에 대한 정보를 보내준다.
GCCreateItem gcCreateItem;
gcCreateItem.setObjectID(pNewItem->getObjectID());
gcCreateItem.setItemClass((BYTE)pNewItem->getItemClass());
gcCreateItem.setItemType(pNewItem->getItemType());
gcCreateItem.setOptionType(pNewItem->getOptionTypeList());
gcCreateItem.setDurability(pNewItem->getDurability());
gcCreateItem.setSilver(pNewItem->getSilver());
gcCreateItem.setEnchantLevel(pNewItem->getEnchantLevel());
gcCreateItem.setItemNum(pNewItem->getNum());
gcCreateItem.setInvenX(InvenX);
gcCreateItem.setInvenY(InvenY);
pPlayer->sendPacket(&gcCreateItem);
}
#endif // __GAME_SERVER__
__END_DEBUG_EX __END_CATCH
}
示例8: addShrineToZone
Item* CastleShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_t itemType )
throw(Error)
{
__BEGIN_TRY
// 성단을 넣을 존을 가져온다.
Zone* pZone = getZoneByZoneID(shrineInfo.getZoneID());
Assert(pZone != NULL);
MonsterCorpse* pShrine = new MonsterCorpse(shrineInfo.getMonsterType(), shrineInfo.getName(), 2);
Assert(pShrine != NULL);
pShrine->setShrine(true);
pShrine->setZone(pZone);
pZone->getObjectRegistry().registerObject(pShrine);
shrineInfo.setObjectID(pShrine->getObjectID());
Item* pItem = NULL;
/* if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_GUARD )
{
pShrine->setFlag(Effect::EFFECT_CLASS_SHRINE_GUARD);
EffectShrineGuard* pEffect = new EffectShrineGuard(pShrine);
pEffect->setShrineID(itemType);
pEffect->setTick(60 * 10);
pShrine->getEffectManager().addEffect(pEffect);
}
else if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_HOLY )
{
pShrine->setFlag(Effect::EFFECT_CLASS_SHRINE_HOLY);
EffectShrineHoly* pEffect = new EffectShrineHoly(pShrine);
pEffect->setShrineID(itemType);
pEffect->setTick(60 * 10);
pShrine->getEffectManager().addEffect(pEffect);
}*/
TPOINT tp = pZone->addItem(pShrine, shrineInfo.getX(), shrineInfo.getY(), true);
Assert(tp.x != -1);
// 성의 상징을 추가할 필요가 있다면 추가한다.
if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_GUARD )
{
//if (AddBible[ itemType ] )
{
list<OptionType_t> optionNULL;
pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_CASTLE_SYMBOL, itemType, optionNULL);
Assert(pItem != NULL);
char strZoneID[10];
sprintf(strZoneID, "%d", (int)pZone->getZoneID());
pZone->registerObject(pItem);
pItem->create(strZoneID, STORAGE_CORPSE, pShrine->getObjectID(), 0, 0);
pShrine->addTreasure(pItem);
}
// 수호성단이라는걸 표시해둔다.
pShrine->setFlag(Effect::EFFECT_CLASS_CASTLE_SHRINE_GUARD);
// 모든 수호성단에 Shield Effect 붙인다
pShrine->setFlag(Effect::EFFECT_CLASS_SHRINE_SHIELD);
EffectShrineShield* pEffect = new EffectShrineShield(pShrine);
pEffect->setShrineID(itemType);
pEffect->setTick(60 * 10);
pShrine->getEffectManager().addEffect(pEffect);
}
else
{
// 성지성단이라는걸 표시해둔다.
pShrine->setFlag(Effect::EFFECT_CLASS_CASTLE_SHRINE_HOLY);
}
// 성단 좌표를 새로 세팅한다.
shrineInfo.setX(tp.x);
shrineInfo.setY(tp.y);
return pItem;
__END_CATCH
}
示例9: execute
//.........这里部分代码省略.........
pLuaSelectItem = m_pLuaSlayerItem;
luaFileName = m_SlayerFilename;
}
else if (pPC->isVampire() )
{
// 루아에 뱀파이어의 레벨을 set한다.
Vampire* pVampire = dynamic_cast<Vampire*>(pPC);
Assert(pVampire != NULL);
int level = pVampire->getLevel();
m_pLuaVampireItem->setLevel(level);
pLuaSelectItem = m_pLuaVampireItem;
luaFileName = m_VampireFilename;
}
// 루아의 계산 결과를 받아 아이템을 생성한다.
pLuaSelectItem->prepare();
int result = pLuaSelectItem->executeFile(luaFileName);
LuaState::logError(result);
ItemClass = pLuaSelectItem->getItemClass();
ItemType = pLuaSelectItem->getItemType();
OptionType = pLuaSelectItem->getOptionType();
OptionType2 = pLuaSelectItem->getOptionType2();
pLuaSelectItem->clear();
if(ItemClass >= Item::ITEM_CLASS_MAX )
{
filelog("AccountEventItemError.txt", "[ ItemInfo Error ] : ItemClass = %d , ItemType = %d , OptionType = %d", ItemClass, ItemType, OptionType);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
return;
}
// 선물(Item)을 만든다.
list<OptionType_t> optionTypeList;
if (OptionType != 0 ) optionTypeList.push_back(OptionType);
if (OptionType2 != 0 ) optionTypeList.push_back(OptionType2);
pItem = g_pItemFactoryManager->createItem(ItemClass, ItemType, optionTypeList);
Assert(pItem != NULL);
// 인벤토리에 아이템을 넣을 빈 자리를 받아온다.
TPOINT p;
if (!pInventory->getEmptySlot(pItem, p))
{
SAFE_DELETE(pItem);
GCNPCResponse response;
response.setCode(NPC_RESPONSE_NO_EMPTY_SLOT);
pGamePlayer->sendPacket(&response);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
return;
}
// 선물을 인벤토리에 추가한다.
pZone->getObjectRegistry().registerObject(pItem);
pInventory->addItem(p.x, p.y, pItem);
pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, p.x, p.y);
// ItemTraceLog 를 남긴다
if (pItem != NULL && pItem->isTraceItem() )
{
remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC);
remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature1->getZone()->getZoneID(), pCreature1->getX(), pCreature1->getY());
}
// 클라이언트에 선물이 추가되었음을 알린다.
GCCreateItem gcCreateItem;
makeGCCreateItem(&gcCreateItem, pItem, p.x, p.y);
pPlayer->sendPacket(&gcCreateItem);
// 선물을 받았다고 Flag 를 켠다.
pGamePlayer->setSpecialEventCount(pGamePlayer->getSpecialEventCount() | m_SpecialEventFlag);
// Flag 를 저장한다.
pGamePlayer->saveSpecialEventCount();
// 보상을 받았다고 클라이언트에 보낸다.
GCNPCResponse response;
response.setCode(NPC_RESPONSE_GIVE_EVENT_ITEM_OK);
pPlayer->sendPacket(&response);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
__END_CATCH
}
示例10: execute
//.........这里部分代码省略.........
gcAddEffect.setEffectID(pCreatureEffect->getSendEffectClass());
pZone->broadcastPacket(X, Y, &gcAddEffect);
// addSimpleCreatureEffect(pGroundElemental, Effect::EFFECT_CLASS_GROUND_ELEMENTAL_CENTER);
// for (int i = 0; i < m_MaskIndex[Grade]; ++i )
for (oX = X - 2 ; oX <= X + 2 ; ++oX )
for (oY = Y - 2 ; oY <= Y + 2 ; ++oY )
{
// oX = m_ElementalMask[Grade][i].x;
// oY = m_ElementalMask[Grade][i].y;
if (!rect.ptInRect(oX, oY)) continue;
if (oX == X && oY == Y ) continue;
Tile& tile = pZone->getTile(oX, oY);
if (!tile.canAddEffect()) continue;
if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) ) continue;
// 같은 이펙트가 이미 존재한다면 삭제한다.
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GROUND_ELEMENTAL_AURA);
if (pOldEffect != NULL)
{
ObjectID_t effectID = pOldEffect->getObjectID();
pZone->deleteEffect(effectID);
}
// 이펙트 오브젝트를 생성한다.
EffectSummonGroundElemental* pEffect = new EffectSummonGroundElemental(pZone, oX, oY);
pEffect->setDeadline(output.Duration);
// 타일에 붙은 이펙트는 OID를 받아야 한다.
ObjectRegistry & objectregister = pZone->getObjectRegistry();
objectregister.registerObject(pEffect);
// 존 및 타일에다가 이펙트를 추가한다.
pZone->addEffect(pEffect);
tile.addEffect(pEffect);
GCAddEffectToTile gcAddEffect;
gcAddEffect.setXY(oX, oY);
gcAddEffect.setEffectID(pEffect->getSendEffectClass());
gcAddEffect.setObjectID(pEffect->getObjectID());
gcAddEffect.setDuration(output.Duration);
pZone->broadcastPacket(oX, oY, &gcAddEffect);
}
ZoneCoord_t myX = pOusters->getX();
ZoneCoord_t myY = pOusters->getY();
_GCSkillToTileOK1.setSkillType(SkillType);
_GCSkillToTileOK1.setCEffectID(CEffectID);
_GCSkillToTileOK1.setX(X);
_GCSkillToTileOK1.setY(Y);
_GCSkillToTileOK1.setDuration(output.Duration);
_GCSkillToTileOK1.setGrade(Grade);
_GCSkillToTileOK3.setObjectID(pOusters->getObjectID());
_GCSkillToTileOK3.setSkillType(SkillType);
_GCSkillToTileOK3.setX(X);
_GCSkillToTileOK3.setY(Y);
_GCSkillToTileOK3.setGrade(Grade);
_GCSkillToTileOK4.setSkillType(SkillType);
示例11: execute
//.........这里部分代码省略.........
LuaState::logError(result);
pLuaSelectItem->clear();
}
Timeval afterTime;
getCurrentTime(afterTime);
cout << "luaExecute time before : " << beforeTime.tv_sec << "." << beforeTime.tv_usec << endl;
cout << "luaExecute time after : " << afterTime.tv_sec << "." << afterTime.tv_usec << endl;
*/
//--------------------------------------------------------
// 루아의 계산 결과를 받아 아이템을 생성한다.
pLuaSelectItem->prepare();
int result = pLuaSelectItem->executeFile(luaFileName);
LuaState::logError(result);
ItemClass = pLuaSelectItem->getItemClass();
ItemType = pLuaSelectItem->getItemType();
OptionType = pLuaSelectItem->getOptionType();
OptionType2 = pLuaSelectItem->getOptionType2();
pLuaSelectItem->clear();
if(ItemClass >= Item::ITEM_CLASS_MAX )
//|| ItemType >= ITEM_TYPE_MAX || ItemType < 0
// || OptionType == 0)
{
filelog("GiveEventItemError.txt", "[ ItemInfo Error ] : ItemClass = %d , ItemType = %d , OptionType = %d", ItemClass, ItemType, OptionType);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
return;
}
// 선물(Item)을 만든다.
list<OptionType_t> optionTypeList;
if (OptionType != 0 ) optionTypeList.push_back(OptionType);
if (OptionType2 != 0 ) optionTypeList.push_back(OptionType2);
pItem = g_pItemFactoryManager->createItem(ItemClass, ItemType, optionTypeList);
Assert(pItem != NULL);
_TPOINT pt;
if (!pInventory->getEmptySlot(pItem, pt))
{
SAFE_DELETE(pItem);
GCNPCResponse response;
response.setCode(NPC_RESPONSE_NO_EMPTY_SLOT);
pPlayer->sendPacket(&response);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
return;
}
CoordInven_t X = pt.x;
CoordInven_t Y = pt.y;
// 선물을 인벤토리에 추가한다.
pZone->getObjectRegistry().registerObject(pItem);
pInventory->addItem(X, Y, pItem);
pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, X, Y);
// ItemTraceLog 를 남긴다
if (pItem != NULL && pItem->isTraceItem() )
{
remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC);
remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature1->getZone()->getZoneID(), pCreature1->getX(), pCreature1->getY());
}
// 클라이언트에 선물이 추가되었음을 알린다.
GCCreateItem gcCreateItem;
makeGCCreateItem(&gcCreateItem, pItem, X, Y);
pPlayer->sendPacket(&gcCreateItem);
// Flag을 켠다.
pFlagSet->turnOn(m_FlagSetType);
// Flag을 저장한다.
pFlagSet->save(pPC->getName());
// 아이템 교환이 이루어 졌다고 클라이언트에 알린다.
GCNPCResponse response;
response.setCode(NPC_RESPONSE_GIVE_EVENT_ITEM_OK);
pPlayer->sendPacket(&response);
GCNPCResponse quit;
quit.setCode(NPC_RESPONSE_QUIT_DIALOGUE);
pPlayer->sendPacket(&quit);
__END_CATCH
}
示例12: execute
//.........这里部分代码省略.........
if (!tile.canAddEffect()) continue;
// 머시 그라운드 있음 추가 못한당.
if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) continue;
if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) ) continue;
// 같은 이펙트가 이미 존재한다면 삭제한다.
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_PROMINENCE);
if (pOldEffect != NULL)
{
ObjectID_t effectID = pOldEffect->getObjectID();
pZone->deleteEffect(effectID);
}
checkMine(pZone, oX, oY);
// 이펙트 오브젝트를 생성한다.
EffectProminence* pEffect = new EffectProminence(pZone, oX, oY);
pEffect->setUserObjectID(pOusters->getObjectID());
pEffect->setDeadline(output.Duration);
pEffect->setNextTime(0);
pEffect->setTick(output.Tick);
pEffect->setDamage(output.Damage);
pEffect->setLevel(pOustersSkillSlot->getExpLevel());
if (Grade > 0 )
{
if (Grade == 1 ) pEffect->setSendEffectClass(Effect::EFFECT_CLASS_PROMINENCE_2);
else pEffect->setSendEffectClass(Effect::EFFECT_CLASS_PROMINENCE_3);
}
// 타일에 붙은 이펙트는 OID를 받아야 한다.
ObjectRegistry & objectregister = pZone->getObjectRegistry();
objectregister.registerObject(pEffect);
// 존 및 타일에다가 이펙트를 추가한다.
pZone->addEffect(pEffect);
tile.addEffect(pEffect);
GCAddEffectToTile gcAddEffect;
gcAddEffect.setXY(oX, oY);
gcAddEffect.setEffectID(pEffect->getSendEffectClass());
gcAddEffect.setObjectID(pEffect->getObjectID());
gcAddEffect.setDuration(output.Duration);
pZone->broadcastPacket(oX, oY, &gcAddEffect, pOusters);
}
ZoneCoord_t myX = pOusters->getX();
ZoneCoord_t myY = pOusters->getY();
_GCSkillToTileOK1.setSkillType(SkillType);
_GCSkillToTileOK1.setCEffectID(CEffectID);
_GCSkillToTileOK1.setX(X);
_GCSkillToTileOK1.setY(Y);
_GCSkillToTileOK1.setDuration(output.Duration);
_GCSkillToTileOK1.setGrade(Grade);
_GCSkillToTileOK3.setObjectID(pOusters->getObjectID());
_GCSkillToTileOK3.setSkillType(SkillType);
_GCSkillToTileOK3.setX(X);
_GCSkillToTileOK3.setY(Y);
_GCSkillToTileOK3.setGrade(Grade);
_GCSkillToTileOK4.setSkillType(SkillType);
示例13: execute
//////////////////////////////////////////////////////////////////////////////
// 슬레이어 타일 핸들러
//////////////////////////////////////////////////////////////////////////////
void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID)
throw(Error)
{
__BEGIN_TRY
//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl;
Assert(pSlayer != NULL);
Assert(pSkillSlot != NULL);
try
{
Player* pPlayer = pSlayer->getPlayer();
Zone* pZone = pSlayer->getZone();
Assert(pPlayer != NULL);
Assert(pZone != NULL);
GCSkillToTileOK1 _GCSkillToTileOK1;
GCSkillToTileOK2 _GCSkillToTileOK2;
GCSkillToTileOK3 _GCSkillToTileOK3;
GCSkillToTileOK4 _GCSkillToTileOK4;
GCSkillToTileOK5 _GCSkillToTileOK5;
GCSkillToTileOK6 _GCSkillToTileOK6;
SkillType_t SkillType = pSkillSlot->getSkillType();
SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);
ZoneCoord_t myX = pSlayer->getX();
ZoneCoord_t myY = pSlayer->getY();
int RequiredMP = (int)pSkillInfo->getConsumeMP();
bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP);
bool bTimeCheck = verifyRunTime(pSkillSlot);
bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()) && checkZoneLevelToUseSkill(pSlayer);
bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot);
bool bTileCheck = false;
VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1);
if (rect.ptInRect(X, Y)) bTileCheck = true;
if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck)
{
// 이펙트의 지속시간을 계산한다.
SkillInput input(pSlayer, pSkillSlot);
SkillOutput output;
computeOutput(input, output);
Range_t Range = 3;
int oX, oY;
list<Creature*> cList; // denier list
ObjectRegistry & objectregister = pZone->getObjectRegistry();
// 일단 이미 sanctuary가 있는지 검색한다.
for(oY = -1; oY <= 1; oY++)
for(oX = -1; oX <= 1; oX++)
{
int tileX = X+oX;
int tileY = Y+oY;
if (rect.ptInRect(tileX, tileY))
{
Tile& tile = pZone->getTile(tileX, tileY);
if (tile.canAddEffect())
{
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SANCTUARY);
// 이미 있다면
// 기술 실패다.
if (pOldEffect != NULL)
{
executeSkillFailNormal(pSlayer, getSkillType(), NULL);
return;
}
}
else
{
executeSkillFailNormal(pSlayer, getSkillType(), NULL);
return;
}
}
}
// 실패하면 마나가 줄면 안 되므로 여기서 줄여준다.
decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1);
for(oY = -1; oY <= 1; oY++)
for(oX = -1; oX <= 1; oX++)
{
int tileX = X+oX;
int tileY = Y+oY;
if (rect.ptInRect(tileX, tileY))
{
//.........这里部分代码省略.........
示例14: execute
//.........这里部分代码省略.........
// canAddMap[normalizeCoord_DARKNESS(oX+1, oY, edge )] = 1;
// canAddMap[normalizeCoord_DARKNESS(oX+1, oY+1, edge )] = 1;
// canAddMap[normalizeCoord_DARKNESS(oX, oY+1, edge )] = 1;
continue;
}
}
}
if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION ) != NULL ) continue;
// 현재 타일에다 이펙트를 추가할 수 있다면...
if (tile.canAddEffect())
{
// 머시 그라운드 있음 추가 못한당.
if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) continue;
if (tile.getEffect(Effect::EFFECT_CLASS_DARKNESS_FORBIDDEN) != NULL ) continue;
// 같은 effect가 있으면 지운다.
Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_DARKNESS);
if (pOldEffect != NULL)
{
ObjectID_t effectID = pOldEffect->getObjectID();
pZone->deleteEffect(effectID);// fix me
}
// 이펙트 클래스를 생성한다.
EffectDarkness* pEffect = new EffectDarkness(pZone , tileX, tileY);
pEffect->setDeadline(output.Duration);
pEffect->setLevel(pVampire->getINT());
pEffect->setDuration(output.Duration);
pEffect->setStartTime();
// Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다.
ObjectRegistry & objectregister = pZone->getObjectRegistry();
objectregister.registerObject(pEffect);
pZone->addEffect(pEffect);
tile.addEffect(pEffect);
const list<Object*>& oList = tile.getObjectList();
for(list<Object*>::const_iterator itr = oList.begin(); itr != oList.end(); itr++)
{
Object* pTarget = *itr;
Creature* pTargetCreature = NULL;
if (pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE
&& ((pTargetCreature = dynamic_cast<Creature*>(pTarget))->isSlayer() || pTargetCreature->isOusters() )
)
{
cList.push_back(pTargetCreature);
_GCSkillToTileOK2.addCListElement(pTargetCreature->getObjectID());
_GCSkillToTileOK4.addCListElement(pTargetCreature->getObjectID());
_GCSkillToTileOK5.addCListElement(pTargetCreature->getObjectID());
}
pEffect->affectObject(pTarget, false);
}
}
}
}
_GCSkillToTileOK1.setSkillType(SkillType);
_GCSkillToTileOK1.setCEffectID(CEffectID);
_GCSkillToTileOK1.setX(X);
_GCSkillToTileOK1.setY(Y);
_GCSkillToTileOK1.setDuration(output.Duration);
_GCSkillToTileOK1.setRange(Range);