本文整理汇总了C++中NPC::AddLootTable方法的典型用法代码示例。如果您正苦于以下问题:C++ NPC::AddLootTable方法的具体用法?C++ NPC::AddLootTable怎么用?C++ NPC::AddLootTable使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NPC
的用法示例。
在下文中一共展示了NPC::AddLootTable方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: unique_spawn
int16 QuestManager::unique_spawn(int npc_type, int grid, int unused, float x, float y, float z, float heading) {
Mob *other = entity_list.GetMobByNpcTypeID(npc_type);
if(other != NULL) {
return(other->GetID());
}
NPCType* tmp = 0;
if ((tmp = Database::Instance()->GetNPCType(npc_type)))
{
NPC* npc = new NPC(tmp, 0, x, y, z, heading);
npc->AddLootTable();
entity_list.AddNPC(npc,true);
// Quag: Sleep in main thread? ICK!
// Sleep(200);
// Quag: check is irrelevent, it's impossible for npc to be 0 here
// (we're in main thread, nothing else can possibly modify it)
// if(npc != 0) {
if(grid > 0)
{
// HarakiriFIXME npc->AssignWaypoints(grid);
}
npc->SendPosUpdate();
// }
return(npc->GetID());
}
return(0);
}
示例2: NPC
bool Spawn2::Process() {
//Yeahlight: This is where an NPC spawn/respawn happens
if (timer->Check()) {
timer->Disable();
SpawnGroup* sg = zone->spawn_group_list->GetSpawnGroup(spawngroup_id_);
if (sg == 0)
return false;
SPAWN_TIME_OF_DAY tmp_time_of_day;
int32 npcid = sg->GetNPCType(&tmp_time_of_day);
if (npcid) {
NPCType* tmp = Database::Instance()->GetNPCType(npcid);
//Yeahlight: Preventing boats from autospawning for Tazadar
if (tmp && tmp->race != 72 && tmp->race != 73) {
tmp->time_of_day = tmp_time_of_day; // Kibanu
NPC* npc = new NPC(tmp, this, x, y, z, heading, false, roamRange, myRoamBox, myPathGrid, myPathGridStart);
npc->AddLootTable();
npc->GetMeleeWeapons();
npc->CalcBonuses(true, true);
entity_list.AddNPC(npc);
}
}
else {
Reset();
}
}
return true;
}
示例3: later
bool Spawn2::Process() {
_ZP(Spawn2_Process);
IsDespawned = false;
if(!Enabled())
return true;
//grab our spawn group
SpawnGroup* sg = zone->spawn_group_list.GetSpawnGroup(spawngroup_id_);
if(NPCPointerValid() && (sg->despawn == 0 || condition_id != 0))
return true;
if (timer.Check()) {
timer.Disable();
_log(SPAWNS__MAIN, "Spawn2 %d: Timer has triggered", spawn2_id);
//first check our spawn condition, if this isnt active
//then we reset the timer and try again next time.
if(condition_id != SC_AlwaysEnabled
&& !zone->spawn_conditions.Check(condition_id, condition_min_value)) {
_log(SPAWNS__CONDITIONS, "Spawn2 %d: spawning prevented by spawn condition %d", spawn2_id, condition_id);
Reset();
return(true);
}
if (sg == NULL) {
database.LoadSpawnGroupsByID(spawngroup_id_,&zone->spawn_group_list);
sg = zone->spawn_group_list.GetSpawnGroup(spawngroup_id_);
}
if (sg == NULL) {
_log(SPAWNS__MAIN, "Spawn2 %d: Unable to locate spawn group %d. Disabling.", spawn2_id, spawngroup_id_);
return false;
}
//have the spawn group pick an NPC for us
uint32 npcid = sg->GetNPCType();
if (npcid == 0) {
_log(SPAWNS__MAIN, "Spawn2 %d: Spawn group %d did not yeild an NPC! not spawning.", spawn2_id, spawngroup_id_);
Reset(); //try again later (why?)
return(true);
}
//try to find our NPC type.
const NPCType* tmp = database.GetNPCType(npcid);
if (tmp == NULL) {
_log(SPAWNS__MAIN, "Spawn2 %d: Spawn group %d yeilded an invalid NPC type %d", spawn2_id, spawngroup_id_, npcid);
Reset(); //try again later
return(true);
}
if(tmp->unique_spawn_by_name)
{
if(!entity_list.LimitCheckName(tmp->name))
{
_log(SPAWNS__MAIN, "Spawn2 %d: Spawn group %d yeilded NPC type %d, which is unique and one already exists.", spawn2_id, spawngroup_id_, npcid);
timer.Start(5000); //try again in five seconds.
return(true);
}
}
if(tmp->spawn_limit > 0) {
if(!entity_list.LimitCheckType(npcid, tmp->spawn_limit)) {
_log(SPAWNS__MAIN, "Spawn2 %d: Spawn group %d yeilded NPC type %d, which is over its spawn limit (%d)", spawn2_id, spawngroup_id_, npcid, tmp->spawn_limit);
timer.Start(5000); //try again in five seconds.
return(true);
}
}
if(sg->despawn != 0 && condition_id == 0)
zone->Despawn(spawn2_id);
if(IsDespawned)
return true;
if(spawn2_id)
database.UpdateSpawn2Timeleft(spawn2_id, zone->GetInstanceID(), 0);
currentnpcid = npcid;
NPC* npc = new NPC(tmp, this, x, y, z, heading, FlyMode3);
//DCBOOKMARK
npc->mod_prespawn(this);
npcthis = npc;
npc->AddLootTable();
npc->SetSp2(spawngroup_id_);
npc->SaveGuardPointAnim(anim);
npc->SetAppearance((EmuAppearance)anim);
entity_list.AddNPC(npc);
//this limit add must be done after the AddNPC since we need the entity ID.
entity_list.LimitAddNPC(npc);
if(sg->roamdist && sg->roambox[0] && sg->roambox[1] && sg->roambox[2] && sg->roambox[3] && sg->delay)
npc->AI_SetRoambox(sg->roamdist,sg->roambox[0],sg->roambox[1],sg->roambox[2],sg->roambox[3],sg->delay);
if(zone->InstantGrids()) {
_log(SPAWNS__MAIN, "Spawn2 %d: Group %d spawned %s (%d) at (%.3f, %.3f, %.3f).", spawn2_id, spawngroup_id_, npc->GetName(), npcid, x, y, z);
LoadGrid();
//.........这里部分代码省略.........
示例4: later
//.........这里部分代码省略.........
timer.Start(5000); //try again in five seconds.
return (true);
}
}
if (tmp->spawn_limit > 0) {
if (!entity_list.LimitCheckType(npcid, tmp->spawn_limit)) {
Log(Logs::Detail,
Logs::Spawns,
"Spawn2 %d: Spawn group %d yeilded NPC type %d, which is over its spawn limit (%d)",
spawn2_id,
spawngroup_id_,
npcid,
tmp->spawn_limit);
timer.Start(5000); //try again in five seconds.
return (true);
}
}
bool ignore_despawn = false;
if (npcthis) {
ignore_despawn = npcthis->IgnoreDespawn();
}
if (ignore_despawn) {
return true;
}
if (spawn_group->despawn != 0 && condition_id == 0 && !ignore_despawn) {
zone->Despawn(spawn2_id);
}
if (IsDespawned) {
return true;
}
currentnpcid = npcid;
NPC *npc = new NPC(tmp, this, glm::vec4(x, y, z, heading), GravityBehavior::Water);
npc->mod_prespawn(this);
npcthis = npc;
npc->AddLootTable();
if (npc->DropsGlobalLoot()) {
npc->CheckGlobalLootTables();
}
npc->SetSp2(spawngroup_id_);
npc->SaveGuardPointAnim(anim);
npc->SetAppearance((EmuAppearance) anim);
entity_list.AddNPC(npc);
//this limit add must be done after the AddNPC since we need the entity ID.
entity_list.LimitAddNPC(npc);
/**
* Roambox init
*/
if (spawn_group->roamdist && spawn_group->roambox[0] && spawn_group->roambox[1] && spawn_group->roambox[2] &&
spawn_group->roambox[3] && spawn_group->delay && spawn_group->min_delay) {
npc->AI_SetRoambox(
spawn_group->roamdist,
spawn_group->roambox[0],
spawn_group->roambox[1],
spawn_group->roambox[2],
spawn_group->roambox[3],
spawn_group->delay,
spawn_group->min_delay
);
}
if (zone->InstantGrids()) {
Log(Logs::Detail,
Logs::Spawns,
"Spawn2 %d: Group %d spawned %s (%d) at (%.3f, %.3f, %.3f).",
spawn2_id,
spawngroup_id_,
npc->GetName(),
npcid,
x,
y,
z);
LoadGrid();
}
else {
Log(Logs::Detail,
Logs::Spawns,
"Spawn2 %d: Group %d spawned %s (%d) at (%.3f, %.3f, %.3f). Grid loading delayed.",
spawn2_id,
spawngroup_id_,
tmp->name,
npcid,
x,
y,
z);
}
}
return true;
}
示例5: GoFish
void Client::GoFish()
{
//TODO: generate a message if we're already fishing
/*if (!fishing_timer.Check()) { //this isn't the right check, may need to add something to the Client class like 'bool is_fishing'
Message_StringID(0, ALREADY_FISHING); //You are already fishing!
return;
}*/
fishing_timer.Disable();
//we're doing this a second time (1st in Client::Handle_OP_Fishing) to make sure that, between when we started fishing & now, we're still able to fish (in case we move, change equip, etc)
if (!CanFish()) //if we can't fish here, we don't need to bother with the rest
return;
//multiple entries yeilds higher probability of dropping...
uint32 common_fish_ids[MAX_COMMON_FISH_IDS] = {
1038, // Tattered Cloth Sandals
1038, // Tattered Cloth Sandals
1038, // Tattered Cloth Sandals
13019, // Fresh Fish
13076, // Fish Scales
13076, // Fish Scales
7007, // Rusty Dagger
7007, // Rusty Dagger
7007 // Rusty Dagger
};
//success formula is not researched at all
int fishing_skill = GetSkill(FISHING); //will take into account skill bonuses on pole & bait
//make sure we still have a fishing pole on:
int32 bslot = m_inv.HasItemByUse(ItemTypeFishingBait, 1, invWhereWorn|invWherePersonal);
const ItemInst* Bait = NULL;
if(bslot != SLOT_INVALID)
Bait = m_inv.GetItem(bslot);
//if the bait isnt equipped, need to add its skill bonus
if(bslot >= IDX_INV && Bait->GetItem()->SkillModType == FISHING) {
fishing_skill += Bait->GetItem()->SkillModValue;
}
if (fishing_skill > 100)
{
fishing_skill = 100+((fishing_skill-100)/2);
}
if (MakeRandomInt(0,175) < fishing_skill) {
uint32 food_id = 0;
//25% chance to fish an item.
if (MakeRandomInt(0, 399) <= fishing_skill ) {
uint32 npc_id = 0;
uint8 npc_chance = 0;
food_id = database.GetZoneFishing(m_pp.zone_id, fishing_skill, npc_id, npc_chance);
//check for add NPC
if(npc_chance > 0 && npc_id) {
if(npc_chance < MakeRandomInt(0, 99)) {
const NPCType* tmp = database.GetNPCType(npc_id);
if(tmp != NULL) {
NPC* npc = new NPC(tmp, NULL, GetX()+3, GetY(), GetZ(), GetHeading(), FlyMode3);
npc->AddLootTable();
npc->AddToHateList(this, 1, 0, false); //no help yelling
entity_list.AddNPC(npc);
Message(MT_Emote, "You fish up a little more than you bargained for...");
}
}
}
}
//consume bait, should we always consume bait on success?
DeleteItemInInventory(bslot, 1, true); //do we need client update?
if(food_id == 0) {
int index = MakeRandomInt(0, MAX_COMMON_FISH_IDS-1);
food_id = common_fish_ids[index];
}
const Item_Struct* food_item = database.GetItem(food_id);
Message_StringID(MT_Skills, FISHING_SUCCESS);
const ItemInst* inst = database.CreateItem(food_item, 1);
if(inst != NULL) {
if(CheckLoreConflict(inst->GetItem()))
{
this->Message_StringID(0,DUP_LORE);
}
else
{
PushItemOnCursor(*inst); // changed from PutItemInInventory(SLOT_CURSOR, *inst); - was additional overhead
SendItemPacket(SLOT_CURSOR,inst,ItemPacketSummonItem);
if(RuleB(TaskSystem, EnableTaskSystem))
UpdateTasksForItem(ActivityFish, food_id);
}
//.........这里部分代码省略.........
示例6: CheckQuests
//.........这里部分代码省略.........
if(target->CastToNPC()->GetGuildOwner() == GuildDBID())
{
entity_list.NPCMessage(this, false, 400, 0, "%s says, 'You are a member of the guild that owns this city, why would you want to conquere it?'", other->GetName(), nmessage);
}
else if(!IsAttackAllowed(other))
{
entity_list.NPCMessage(this, false, 400, 0, "%s says, 'You cannot conquere an allied city.'", other->GetName(), nmessage);
}
else if(database.CityDefense(zone->GetZoneID(),0))
{
entity_list.NPCMessage(this, false, 400, 0, "%s says, 'This city still has men standing, I will not surrender!'", other->GetName(), nmessage);
}
else if(database.SetCityGuildOwned(GuildDBID(),other->GetNPCTypeID()))
{
entity_list.NPCMessage(this, false, 400, 0, "%s says, 'You have won, I surrender to you.'", other->GetName(), nmessage);
zone->SetGuildOwned(GuildDBID());
zone->Repop();
}
}
ps = true;
}
#endif
else if (strstr(command,"SPAWN_NPC") != NULL) {
adverrorinfo = 751;
const NPCType* tmp = 0;
adverrorinfo = 752;
int16 grid = atoi(sep.arg[2]);
int8 guildwarset = atoi(sep.arg[3]);
if ((tmp = database.GetNPCType(atoi(sep.arg[1]))))
{
adverrorinfo = 753;
NPC* npc = new NPC(tmp, 0, other->GetX(), other->GetY(), other->GetZ(), heading);
adverrorinfo = 754;
npc->AddLootTable();
adverrorinfo = 755;
entity_list.AddNPC(npc,true,true);
adverrorinfo = 756;
Sleep(200);
if(npc != 0)
{
if(grid > 0)
npc->AssignWaypoints(grid);
adverrorinfo = 757;
#ifdef GUILDWARS
if(guildwarset > 0 && guildwarset == 1 && GuildDBID() > 0)
npc->SetGuildOwner(GuildDBID());
#endif
adverrorinfo = 758;
npc->SendPosUpdate();
}
}
ps = true;
}
else if (strstr(command,"LEVEL_CHECK") != NULL)
{
int8 Level1 = atoi(sep.arg[1]);
int8 Level2 = atoi(sep.arg[2]);
int8 Levelp = this->GetLevel();
if(Level2 == 0 || Level2 == NULL){
//Min Level
if(Level1 > Levelp)
{
//not high enough to talk too
break;
}