// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
/////////////
// INCLUDE //
/////////////
#include "stdpch.h"
// Client.
#include "cursor_functions.h"
#include "user_entity.h"
#include "entities.h"
#include "net_manager.h"
#include "interface_v3/interface_manager.h"
#include "sheet_manager.h"
#include "interface_v3/inventory_manager.h"
#include "interface_v3/guild_manager.h"
#include "main_loop.h"
// GAME SHARE
#include "game_share/bot_chat_types.h"
// r2
#include "r2/editor.h"
///////////
// USING //
///////////
using namespace NLMISC;
////////////
// GLOBAL //
////////////
// Contextual Cursor.
CContextualCursor ContextCur;
CLFECOMMON::TCLEntityId SlotUnderCursor;
uint32 MissionId = 0;
uint32 MissionRingId = 0;
///////////////
// FUNCTIONS //
///////////////
void checkUnderCursor();
void contextSelect (bool rightClick, bool dblClick);
void contextAttack (bool rightClick, bool dblClick);
void contextQuarter (bool rightClick, bool dblClick);
void contextLoot (bool rightClick, bool dblClick);
void contextPickUp (bool rightClick, bool dblClick);
void contextTradeItem (bool rightClick, bool dblClick);
void contextTradePhrase (bool rightClick, bool dblClick);
void contextDynamicMission (bool rightClick, bool dblClick);
void contextStaticMission (bool rightClick, bool dblClick);
void contextTradePact (bool rightClick, bool dblClick);
void contextCreateGuild (bool rightClick, bool dblClick);
void contextNews (bool rightClick, bool dblClick);
void contextTeleport (bool rightClick, bool dblClick);
void contextFaction (bool rightClick, bool dblClick);
void contextCosmetic (bool rightClick, bool dblClick);
void contextTalk (bool rightClick, bool dblClick);
void contextExtractRM (bool rightClick, bool dblClick);
void contextMission (bool rightClick, bool dblClick);
void contextWebPage (bool rightClick, bool dblClick);
void contextRingMission (bool rightClick, bool dblClick);
void contextOutpost (bool rightClick, bool dblClick);
void contextBuildTotem (bool rightClick, bool dblClick);
//-----------------------------------------------
// initContextualCursor :
// Initialize Contextual Cursor.
//-----------------------------------------------
void initContextualCursor()
{
// Create states of the Contextual Cursor.
ContextCur.add(false, "STAND BY", string("curs_default.tga"), 0.0f, checkUnderCursor, 0);
ContextCur.add(false, "SELECTABLE", string("curs_pick.tga"), 0.0f, checkUnderCursor, contextSelect);
// ContextCur.add(false, "ATTACK", string("hand_attack.TGA"), 0.0f, checkUnderCursor, contextAttack);
// ContextCur.add(false, "QUARTER", string("hand_harvest.TGA"), 0.0f, checkUnderCursor, contextQuarter);
// ContextCur.add(false, "LOOT", string("hand_loot.TGA"), 0.0f, checkUnderCursor, contextLoot);
// ContextCur.add(false, "PICKUP", string("hand_loot.TGA"), 0.0f, checkUnderCursor, contextPickUp);
// ContextCur.add(false, "TALK", string("hand_speak.TGA"), 0.0f, checkUnderCursor, contextTalk);
// String Cursors
ContextCur.add(true, "ATTACK", string("uimGcmAttack"), 0.0f, checkUnderCursor, contextAttack);
ContextCur.add(true, "QUARTER", string("uimGcmQuartering"), 0.0f, checkUnderCursor, contextQuarter);
ContextCur.add(true, "LOOT", string("uimGcmLoot"), 0.0f, checkUnderCursor, contextLoot);
ContextCur.add(true, "PICKUP", string("uimGcmPickUp"), 0.0f, checkUnderCursor, contextPickUp);
ContextCur.add(true, "TRADE ITEM", string("uimGcmTrade"), 0.0f, checkUnderCursor, contextTradeItem);
ContextCur.add(true, "TRADE PHRASE", string("uimGcmTradePhase"), 0.0f, checkUnderCursor, contextTradePhrase);
ContextCur.add(true, "DYNAMIC MISSION", string("uimGcmDynamicMission"), 0.0f, checkUnderCursor, contextDynamicMission);
ContextCur.add(true, "STATIC MISSION", string("uimGcmMissions"), 0.0f, checkUnderCursor, contextStaticMission);
ContextCur.add(true, "TRADE PACT", string("uimGcmTradePact"), 0.0f, checkUnderCursor, contextTradePact);
ContextCur.add(true, "CREATE GUILD", string("uimGcmCreateGuild"), 0.0f, checkUnderCursor, contextCreateGuild);
ContextCur.add(true, "NEWS", string("uimGcmNews"), 0.0f, checkUnderCursor, contextNews);
ContextCur.add(true, "TELEPORT", string("uimGcmTeleport"), 0.0f, checkUnderCursor, contextTeleport);
ContextCur.add(true, "FACTION", string("uimGcmFaction"), 0.0f, checkUnderCursor, contextFaction);
ContextCur.add(true, "COSMETIC", string("uimGcmCosmetic"), 0.0f, checkUnderCursor, contextCosmetic);
// ContextCur.add(true, "TALK", string("uimGcmTalk"), 0.0f, checkUnderCursor, contextTalk);
ContextCur.add(true, "EXTRACT_RM", string("uimGcmExtractRM"), 0.0f, checkUnderCursor, contextExtractRM);
ContextCur.add(true, "MISSION", string(""), 0.0f, checkUnderCursor, contextMission);
ContextCur.add(true, "WEB PAGE", string(""), 0.0f, checkUnderCursor, contextWebPage);
ContextCur.add(true, "OUTPOST", string(""), 0.0f, checkUnderCursor, contextOutpost);
ContextCur.add(true, "RING MISSION", string(""), 0.0f, checkUnderCursor, contextRingMission);
ContextCur.add(true, "BUILD_TOTEM", string("uimGcmChooseBuilding"), 0.0f, checkUnderCursor, contextBuildTotem);
}// initContextualCursor //
//-----------------------------------------------
// releaseContextualCursor :
// Release cursors.
//-----------------------------------------------
void releaseContextualCursor()
{
ContextCur.release();
}// releaseContextualCursor //
//-----------------------------------------------
// testMissionOption
//-----------------------------------------------
static bool testMissionOption(sint32 priorityWanted)
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
uint32 textID = 0;
sint32 bestPriority = 0;
for(uint k = 0; k < NUM_MISSION_OPTIONS; ++k)
{
std::string nodeName = toString("LOCAL:TARGET:CONTEXT_MENU:MISSIONS_OPTIONS:%d:PRIORITY", (int) k);
CCDBNodeLeaf *pNL = pIM->getDbProp(nodeName, false);
if(pNL)
{
sint32 priority = pNL->getValue32();
if(priority == priorityWanted)
{
// Special for priority 2 (yoyo: don't know why...). fail if more than one choice
if(priorityWanted != 2 || textID==0)
{
nodeName = toString("LOCAL:TARGET:CONTEXT_MENU:MISSIONS_OPTIONS:%d:TITLE", (int) k);
pNL = pIM->getDbProp(nodeName, false);
if(pNL && pNL->getValue32())
{
textID = pNL->getValue32();
MissionId = k;
bestPriority = priority;
// general case: found so stop. priority==2: must check all options
if(priorityWanted!=2)
break;
}
}
// here means that priorityWanted==2 and textId!=0
else
{
// More than a choice for priorityWanted=2 mission options so nothing to show.
textID=0;
break;
}
}
}
else
nlwarning("checkUnderCursor: entry '%s' dose not exist.", nodeName.c_str());
}
// Get the Text for the cursor
if(textID)
{
ucstring result;
bool res = STRING_MANAGER::CStringManagerClient::instance()->getDynString(textID, result);
if (!res)
result = NLMISC::CI18N::get("uiMissionOptionNotReceived");
if(ContextCur.context("MISSION", 0.0, result))
return true;
}
return false;
}
//-----------------------------------------------
// testMissionRing
//-----------------------------------------------
static bool testMissionRing()
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
for(uint i=0;igetDbProp(toString("LOCAL:TARGET:CONTEXT_MENU:MISSION_RING:%d:TITLE", i), false);
if(pNL && pNL->getValue32())
{
uint32 textID = pNL->getValue32();
// if the string is not received display a temp string
ucstring missionRingText;
if(!STRING_MANAGER::CStringManagerClient::instance()->getDynString(textID, missionRingText))
missionRingText = NLMISC::CI18N::get("uiMissionRingNameNotReceived");
// display the cursor
MissionRingId= i;
if(ContextCur.context("RING MISSION", 0.f, missionRingText))
return true;
}
}
return false;
}
//-----------------------------------------------
// checkUnderCursor :
// Select the right context according to what is under the cursor.
//-----------------------------------------------
void checkUnderCursor()
{
// Get the interface instance.
CInterfaceManager *IM = CInterfaceManager::getInstance();
if(IM == 0)
return;
// Get the cursor instance
CViewPointer *cursor = IM->getPointer();
if(cursor == 0)
return;
// No Op if screen minimized
if(IM->getViewRenderer().isMinimized())
return;
// Get the pointer position (in pixel)
sint32 x, y;
cursor->getPointerPos(x, y);
// Over the interface ?
if (IM->getWindowUnder(x, y) == NULL)
{
// Is the pointer in the window ?
if(x < 0 || y <0)
return;
uint32 w, h;
CViewRenderer &viewRender = IM->getViewRenderer();
viewRender.getScreenSize(w, h);
if(x>=(sint32)w || y>=(sint32)h)
return;
// Get the pointer position (in float)
float cursX, cursY;
cursX = (float)x/(float)w;
cursY = (float)y/(float)h;
// Get the entities under position
bool isPlayerUnderCursor;
CEntityCL *entity;
entity= EntitiesMngr.getEntityUnderPos(cursX, cursY, ClientCfg.SelectionDist, isPlayerUnderCursor);
// If the mouse is over the player make the player transparent
CCDBNodeLeaf *pNL = IM->getDbProp("UI:SAVE:USER_CHAR_FADE", false);
if ((pNL != NULL) && (pNL->getValue32() == 1) && UserEntity->selectable())
{
// If the nearest entity is the player, hide!
if (isPlayerUnderCursor)
UserEntity->makeTransparent(true);
else
UserEntity->makeTransparent(false);
}
else
UserEntity->makeTransparent(false);
// make transparent the entity under cursor?
if (ClientCfg.TransparentUnderCursor)
{
for (uint32 i = 1; i < 255; ++i)
{
CEntityCL *pE = EntitiesMngr.entity(i);
if (pE != NULL)
{
if (pE == entity)
pE->makeTransparent(true);
else
pE->makeTransparent(false);
}
}
}
// If there is an entity selected -> Set as the Target.
if(entity)
{
// Get the distance between the user and the entity.
float dist = (float)(entity->pos() - UserEntity->pos()).norm()-entity->box().getRadius();
// Entity Slot under the cursor.
SlotUnderCursor = entity->slot();
uint32 availablePrograms = (uint32)IM->getDbProp("LOCAL:TARGET:CONTEXT_MENU:PROGRAMMES")->getValue32();
bool entityAttackable = (availablePrograms&(1<properties().attackable();
if (ClientCfg.R2EDEnabled)
{
if (R2::getEditor().isDMing())
{
availablePrograms = 0;
entityAttackable = false;
}
}
// If the selection is not the entity under the cursor.
if(SlotUnderCursor != UserEntity->selection())
{
// If the user is fighting, clicking automatically attacks the new target
if( ClientCfg.AtkOnSelect && UserEntity->isFighting() && entityAttackable)
{
if(ContextCur.context("ATTACK"))
return;
}
// If the Entity is selectable -> select it.
else if(entity->properties().selectable())
{
if(ContextCur.context("SELECTABLE", dist))
return;
}
}
// Entity Under the cursor is the entity selected.
else
{
// Wait for the target is up to date. Do not display context cursor if the user is mounted.
if( (UserEntity->selection() == UserEntity->targetSlot()) &&
(! UserEntity->isRiding()) )
{
// Forage source
if ( entity->isForageSource() )
{
if( !UserEntity->isFighting() )
{
if(ContextCur.context("EXTRACT_RM"))
return;
}
}
// Alive
else if(entity->isDead()==false)
{
// Talk/Trade
// Mission Option of priority 3
if(testMissionOption(3))
return;
// other
if(availablePrograms)
{
// Static Mission
if(availablePrograms & (1 << BOTCHATTYPE::ChooseMissionFlag))
{
if(ContextCur.context("STATIC MISSION"))
return;
}
// Trade Item
else if (availablePrograms & (1 << BOTCHATTYPE::TradeItemFlag))
{
if(ContextCur.context("TRADE ITEM"))
return;
}
// Trade Phrase
else if(availablePrograms & (1 << BOTCHATTYPE::TradePhraseFlag))
{
if(ContextCur.context("TRADE PHRASE"))
return;
}
// Dynamic Mission
// else if(availablePrograms & (1 << BOTCHATTYPE::DynamicMissionFlag))
// {
// if(ContextCur.context("DYNAMIC MISSION"))
// return;
// }
// Trade Pact
else if(availablePrograms & (1 << BOTCHATTYPE::TradePactFlag))
{
if(ContextCur.context("TRADE PACT"))
return;
}
// Create Guild
else if(availablePrograms & (1 << BOTCHATTYPE::CreateGuildFlag))
{
if (!CGuildManager::getInstance()->isInGuild())
if(ContextCur.context("CREATE GUILD"))
return;
}
// News
else if(availablePrograms & (1 << BOTCHATTYPE::NewsFlag))
{
if(ContextCur.context("NEWS"))
return;
}
// Teleport
else if(availablePrograms & (1 << BOTCHATTYPE::TradeTeleportFlag))
{
if(ContextCur.context("TELEPORT"))
return;
}
// Faction Items
else if(availablePrograms & (1 << BOTCHATTYPE::TradeFactionFlag))
{
if(ContextCur.context("FACTION"))
return;
}
// Cosmetic
else if(availablePrograms & (1 << BOTCHATTYPE::TradeCosmeticFlag))
{
if(ContextCur.context("COSMETIC"))
return;
}
// WebPage
else if(availablePrograms & (1 << BOTCHATTYPE::WebPageFlag))
{
// get the web page title textID
CCDBNodeLeaf *pNL = IM->getDbProp("LOCAL:TARGET:CONTEXT_MENU:WEB_PAGE_TITLE", false);
if(pNL && pNL->getValue32())
{
uint32 textID = pNL->getValue32();
// if the string is not received display a temp string
ucstring webPageText;
if(!STRING_MANAGER::CStringManagerClient::instance()->getDynString(textID, webPageText))
webPageText = NLMISC::CI18N::get("uiWebPageNameNotReceived");
// display the cursor
if(ContextCur.context("WEB PAGE", 0.f, webPageText))
return;
}
}
// OutpostFlag
else if(availablePrograms & (1 << BOTCHATTYPE::OutpostFlag))
{
// get the outpost sheet
CCDBNodeLeaf *pNL = IM->getDbProp("LOCAL:TARGET:CONTEXT_MENU:OUTPOST", false);
if(pNL && pNL->getValue32())
{
// get the outpost name
CSheetId outpostSheet(pNL->getValue32());
ucstring outpostName;
outpostName= ucstring(STRING_MANAGER::CStringManagerClient::getOutpostLocalizedName(outpostSheet));
// display the cursor
if(ContextCur.context("OUTPOST", 0.f, outpostName))
return;
}
}
// Spire Totem
else if(availablePrograms & (1 << BOTCHATTYPE::Totem))
{
if(ContextCur.context("BUILD_TOTEM"))
return;
}
}
// test mission options of lesser priorities
if(testMissionOption(2))
return;
if(testMissionOption(1))
return;
// test ring mission
if(testMissionRing())
return;
// Attack
if (entityAttackable)
{
if(ContextCur.context("ATTACK"))
return;
}
}
// Dead
else
{
if (!R2::getEditor().isDMing())
{
// Quartering
if((entity->properties()).harvestable())
{
if(ContextCur.context("QUARTER"))
return;
}
// Loot
else if((entity->properties()).lootable())
{
if(ContextCur.context("LOOT"))
return;
}
// Pick Up
else if((entity->properties()).liftable())
{
if(ContextCur.context("PICKUP"))
return;
}
}
}
if(entity->properties().selectable())
{
if(ContextCur.context("SELECTABLE", dist))
return;
}
}
}
}
else
SlotUnderCursor = CLFECOMMON::INVALID_SLOT;
}
else
{
if(UserEntity)
UserEntity->makeTransparent(false);
}
// Default Context.
ContextCur.context("STAND BY");
}// checkUnderCursor //
//-----------------------------------------------
// contextSelect :
// Select what is under the cursor.
// \Warning Be sure the checkUnderCursor and contextSelect are done after entites removed.
//-----------------------------------------------
void contextSelect(bool /* rightClick */, bool /* dblClick */)
{
// Push a message with the entity target (in slot).
if(SlotUnderCursor != CLFECOMMON::INVALID_SLOT)
{
// Select the entity
UserEntity->selection(SlotUnderCursor);
}
}// contextSelect //
//-----------------------------------------------
// contextAttack :
//-----------------------------------------------
void contextAttack(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
// Select the entity to target.
UserEntity->selection(SlotUnderCursor);
if( UserEntity->canEngageCombat() )
{
// Move to the current selection and attack.
UserEntity->moveToAttack();
}
}// contextAttack //
//-----------------------------------------------
// contextQuarter :
//-----------------------------------------------
void contextQuarter(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::Quarter);
}// contextQuarter //
//-----------------------------------------------
// contextLoot :
//-----------------------------------------------
void contextLoot(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::Loot);
}// contextLoot //
//-----------------------------------------------
// contextPickUp :
//-----------------------------------------------
void contextPickUp(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::PickUp);
}// contextPickUp //
//-----------------------------------------------
// contextTradeItem :
//-----------------------------------------------
void contextTradeItem(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradeItem);
}// contextTradeItem //
//-----------------------------------------------
// contextTradePhrase :
//-----------------------------------------------
void contextTradePhrase(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradePhrase);
}// contextTradePhrase //
//-----------------------------------------------
// contextDynamicMission :
//-----------------------------------------------
void contextDynamicMission(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::DynamicMission);
}// contextDynamicMission //
//-----------------------------------------------
// contextStaticMission :
//-----------------------------------------------
void contextStaticMission(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::StaticMission);
}// contextStaticMission //
//-----------------------------------------------
// contextTradePact :
//-----------------------------------------------
void contextTradePact(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradePact);
}// contextTradePact //
//-----------------------------------------------
// contextCreateGuild :
//-----------------------------------------------
void contextCreateGuild(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::CreateGuild);
}// contextCreateGuild //
//-----------------------------------------------
// contextNews :
//-----------------------------------------------
void contextNews(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::News);
}// contextNews //
//-----------------------------------------------
// contextTeleport :
//-----------------------------------------------
void contextTeleport(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradeTeleport);
}// contextTeleport //
//-----------------------------------------------
// contextFaction :
//-----------------------------------------------
void contextFaction(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradeFaction);
}// contextFaction //
//-----------------------------------------------
// contextCosmetic :
//-----------------------------------------------
void contextCosmetic(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::TradeCosmetic);
}// contextCosmetic //
//-----------------------------------------------
// contextTalk :
//-----------------------------------------------
void contextTalk(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
// Get the interface instace.
CInterfaceManager *IM = CInterfaceManager::getInstance();
if(IM == 0)
return;
// Get Entity Program
uint32 availablePrograms = (uint32)IM->getDbProp("LOCAL:TARGET:CONTEXT_MENU:PROGRAMMES")->getValue32();
// Static Mission
if(availablePrograms & (1 << BOTCHATTYPE::ChooseMissionFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::StaticMission);
// Trade Item
else if (availablePrograms & (1 << BOTCHATTYPE::TradeItemFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::TradeItem);
// Trade Phrase
else if(availablePrograms & (1 << BOTCHATTYPE::TradePhraseFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::TradePhrase);
// Dynamic Mission DEPRECATED
/* else if(availablePrograms & (1 << BOTCHATTYPE::DynamicMissionFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::DynamicMission);*/
// Trade Pact
else if(availablePrograms & (1 << BOTCHATTYPE::TradePactFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::TradePact);
// Create Guild
else if(availablePrograms & (1 << BOTCHATTYPE::CreateGuildFlag))
{
if (!CGuildManager::getInstance()->isInGuild())
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::CreateGuild);
}
// News
else if(availablePrograms & (1 << BOTCHATTYPE::NewsFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::Talk);
// Teleport
else if(availablePrograms & (1 << BOTCHATTYPE::TradeTeleportFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::TradeTeleport);
// Faction
else if(availablePrograms & (1 << BOTCHATTYPE::TradeFactionFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::TradeFaction);
// WebPage
else if(availablePrograms & (1 << BOTCHATTYPE::WebPageFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::WebPage);
// Outpost
else if(availablePrograms & (1 << BOTCHATTYPE::OutpostFlag))
UserEntity->moveTo(SlotUnderCursor, 2.0, CUserEntity::Outpost);
}// contextTalk //
//-----------------------------------------------
// contextExtractRM :
//-----------------------------------------------
void contextExtractRM(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveToExtractionPhrase(SlotUnderCursor, MaxExtractionDistance, ~0, ~0, true );
}
//-----------------------------------------------
// contextMission :
// Callback for dynamic missions
//-----------------------------------------------
void contextMission(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveToMission(SlotUnderCursor, 3.0, MissionId);
}// contextMission //
//-----------------------------------------------
// contextWebPage :
//-----------------------------------------------
void contextWebPage(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::WebPage);
}// contextWebPage //
//-----------------------------------------------
// contextOutpost
//-----------------------------------------------
void contextOutpost(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveTo(SlotUnderCursor, 3.0, CUserEntity::Outpost);
}// contextOutpost //
//-----------------------------------------------
// contextRingMission
//-----------------------------------------------
void contextRingMission(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveToMissionRing(SlotUnderCursor, 3.0, MissionRingId);
}// contextRingMission //
//-----------------------------------------------
// contextBuildTotem :
//-----------------------------------------------
void contextBuildTotem(bool rightClick, bool dblClick)
{
if(rightClick)
return;
if( ClientCfg.DblClickMode && !dblClick)
return;
UserEntity->moveToTotemBuildingPhrase(SlotUnderCursor,MaxExtractionDistance, ~0, ~0, true );
}// contextBuildTotem //