EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Bots (https://www.eqemulator.org/forums/forumdisplay.php?f=676)
-   -   EQoffline, bots and more.. (https://www.eqemulator.org/forums/showthread.php?t=22667)

Ikeren 09-04-2008 04:48 PM

I like the last idea a lot, too --- it would make equipping a raid significantly easier (having each character go through and equip their own raid is worse than just one doing it).

Quote:

2. Bards: Not only is the spell list perfect 60+, but bards now TWIST. That's INCREDIBLE.
Seriously? I can't wait to try that out.

Are group buffs/heals/MGB's working yet, or is that still in the works?

Unrelated, but, The Realm still down?

Congdar 09-04-2008 04:55 PM

Quote:

Originally Posted by Ikeren (Post 155242)
Are group buffs/heals/MGB's working yet, or is that still in the works?

Unrelated, but, The Realm still down?

group buffs/heals Yes these are in.

MGB's no


The Realm issue may be a router problem. The last I heard there was going to be a router reboot, so I'll check it later.

Angelox 09-04-2008 07:34 PM

Quote:

Originally Posted by Congdar (Post 154590)
I've been working on new spell lists for each class and it is a tedious and long process(I think you made the npc lists so probably know this) so during that time some other people have made a release or two with some of the code submissions that were not in the emu build at the time. I only have Beastlord, Bard and Ranger spell lists left to do and once done maybe a bit of tweaking and debugging before I make a new release with the latest emu source. I have 1127 now but it has a group bug in it that is supposedly fixedin 1128 but that download doesn't seem to be available.

I didn't really make those spell sets, I just altered them; I don't know if this still happens, but at the time, NPC pets would 'ghost' at the zones #zone zin - and in reality, most NPCs don't have pets. One of my favorite zones is Droga, when I zoned in there, I was in between a pack of ghosted pets (very unsightly), not to mention, the zone is full of pet casters (none there use pets), and it was really crazy with all the pets . An instant solution for that problem was to eliminate the pets from the NPCs spell sets, and start a new set of spells for the pet users. So , I just duped the current 1-12 spell set to the the 500ish ones, and deleted the pets from the default 1-12 set. And that's how that came to be :)
I guess it wasn't a bad idea, since it is still in use.
Still, zones like Najena, where Magicians are many and most use pets, there is ghosting. but what I did there was make the '#zone in' in a hidden corner in the small pond just before you get to Najenas room. Only GMs are supposed to use #zone, and this way, players won't see the ghost pack at zin.

You really did a great job on the spells, I was working on some spellsets for bots and other NPCs, and I can understand all the labor you put into it.
I also am learning my final part to this emulator which is the code, so I'm able to really see and admire all the work you all are doing, and you did miracles with the Bot code.

I had my little 'BS' arrays going with the spells that wouldn't work right, and was proud of it you made me feel like a first grader with your fixes :) - But it was working! Still I wanted to keep the sow out of the dungeon and had it out tell I added your fix, then it got broke.
I found a spot where you disabled levitation (botAI.cpp);
Code:

// Put the zone levitate check here since bots are able to bypass the client casting check
        if(IsEffectInSpell(AIspells[i].spellid, SE_Levitate) && !zone->CanLevitate()

added this;
Code:

// Put the zone levitate check here since bots are able to bypass the client casting check
        if(IsEffectInSpell(AIspells[i].spellid, SE_Levitate) && !zone->CanLevitate() ||
          IsEffectInSpell(AIspells[i].spellid, SE_MovementSpeed) && !zone->CanCastOutdoor()){

It's good, but disables all speed movement spells, later on in the expansions there was some dungeon spells like 'Spirit of Shrew' which got caught up in that one, but at least there's more resemblance to dungeon play with that -

I really appreciate your work with the Bots and thank you for posting it!

spider661 09-06-2008 09:59 PM

i am running Congdar's 1129 version and im having all kinds of problems cpu at 100% world crash with Microsoft debug error.. im not doing anything diff then i did with my old server sept my old server did not have bots.. there working but the problems outweigh the advantage.. any help?

here is the post on the problems im haveing with it and such any help would be apriciated i would like to add the bots really...

http://www.eqemulator.net/forums/sho...d=1#post155374

is there a diff file for all the bots code? i would not mind pulling all the code and putting it in my compile myself. if thats doable but im not sure how to find it all.. is there some key word i can search for that would show me all the bod code? like myself for update reasons i say /////added////// and //////////end added//// after everything i add and changed after everything i change.

spider661 09-06-2008 11:13 PM

well it seems to be looking good in the compile now so maybe we got it working. thanks to Angelox.. anyways will let you know.

Congdar 09-07-2008 12:46 PM

If you continue to have issues, please collect any log output or code line numbers that would help debug them. For compiling yourself, the sources are available to anyone in the Offline Bot Code Releases ONLY thread right above this thread in the Custom Code forum.

nosfentora 09-07-2008 03:23 PM

in agreement with this:

Quote:

Originally Posted by gygelly (Post 155220)
Another bug:
There is still something wrong with the melee dps of bots. If anything they just seem to miss a LOT.

The best way to check this out:
Make a monk, completely unequipped, level 60, and use setallskills 250.
Make a monkbot (who will also be level 60 and completely unequipped).

#zone chardock, and you'll see 2 equal level sniffers right in front of you. Sick the bot on one of the sniffers, and you attack the other. Youll be able to solo yours no prob, but after you've already killed yours, the bot's sniffer will still be above 80%

I was in Nagafen's Lair - my group (bots: Warrior, Berserker, Cleric, Wizard and Shaman all 45 and mid-level geared from GeorgeS' tools - along with my pet!) were taking a 50 Fire Giant Warrior. I (45 Necro) soloed another 50 Fire Giant Warrior and turned to see that their giant was only 45% down.

something's definitely wonky with the bot dps

Congdar 09-07-2008 05:09 PM

I have never tried GeorgeS' tool. It may not be compatible with the bot code way of equiping npc's. Try equiping them through the trade window, which is where the bot code handles items and equipment. Maybe they'll do better.

I still went ahead and looked at the damage and attack code, the only glaring thing I noticed is that several classes get triple attack at level 60. The bots didn't, so I added that code for next release. I don't think that one attack is gonna make the difference but the code is available for anyone to look at. Maybe something is more obvious to somebody else, or maybe that tool isn't compatible with the bot code and they are attacking naked.

Congdar 09-07-2008 05:21 PM

Quote:

Originally Posted by gygelly (Post 155220)
Another bug:
There is still something wrong with the melee dps of bots. If anything they just seem to miss a LOT.

The best way to check this out:
Make a monk, completely unequipped, level 60, and use setallskills 250.
Make a monkbot (who will also be level 60 and completely unequipped).

#zone chardock, and you'll see 2 equal level sniffers right in front of you. Sick the bot on one of the sniffers, and you attack the other. Youll be able to solo yours no prob, but after you've already killed yours, the bot's sniffer will still be above 80%

I don't see a difference in the way pc's and bots calculate hits/misses/damage. Maybe it's server settings... are you using IntervalAC rule?

Angelox 09-07-2008 05:50 PM

Over all, It seems to all work out fine - I imagine there could be some fine tuning, but since I'm in a group (with the bots), I've been able to play and level nicely.
In a balanced group, what's important is the tanks keep aggro off the casters and that works out pretty well. What would be even nicer is, if the caster gets aggro, the tank would know to move to that mob and get aggro off caster - but that might make the game too easy.

nosfentora 09-08-2008 09:00 AM

Quote:

Originally Posted by Congdar (Post 155423)
I have never tried GeorgeS' tool. It may not be compatible with the bot code way of equiping npc's. Try equiping them through the trade window, which is where the bot code handles items and equipment. Maybe they'll do better.

I still went ahead and looked at the damage and attack code, the only glaring thing I noticed is that several classes get triple attack at level 60. The bots didn't, so I added that code for next release. I don't think that one attack is gonna make the difference but the code is available for anyone to look at. Maybe something is more obvious to somebody else, or maybe that tool isn't compatible with the bot code and they are attacking naked.

I never thought about how the code handles equipping, etc. I had always looked at the bots and saw they were holding/wearing something and it shows up in their gear list.

They seem to equip gear ok using GeorgeS' tool - as their gear shows up in game, in their gear list, their stats change and the bots attacks change from 'punch' to 'slash' (or 'crush') after i've equipped a sword.

I'll try equipping them in-game and see what happens.

I gotta say though, keep up the good work. The addition of the bots is making the game fun again! Well done Magoth78 and thanks Condagar for picking up the project!

I still think if Sony is gonna rip off the bots and get paid for them in live - they should at least give something in return (opcodes or spawn info for our incomplete zones!) .... like that'll happen.... /sigh

gygelly 09-08-2008 02:47 PM

IntervalAC is set to true...is that what I want it to be?
All the AC stuff in the values table is also set to default, though according to the description they don't take affect if IntervalAC is true.

And just in case, I have been equipping all the bots manually.

I'll do more tests across levels (to ensure it's not just triple attack), but the difference is fairly evident just in casual gameplay, leveling from 1 to 60 with bots. Just yesterday in Mistmoore at lvl 40, I found that I could sick an entire well balanced group of bots on one mob, and nuke a different mob dead with my chanter before theirs died.

Btw: I agree this is CRAZY fun. Me and my guildies are having a blast with it.

Congdar 09-08-2008 03:31 PM

I'm wondering if the client adds something to the calcs. Specifically, ATK looks wacked in the code. It seems to benefit the defender if the attackers ATK is higher than theirs. Maybe the client does something with the ATK value?

I'm all for making the bots as close to a pc as possible, but nothing is super obvious as far as the code goes. I've tried to copy the attack/damage methods between the pc code and the bot code as closely as possible. Maybe i've missed something somewhere... I'll keep looking.

macvaliant7 09-09-2008 11:11 PM

Bot aggro
 
I installed the 1129 update pack and the latest EQOffline binaries/dll the problem i have is even though the warrior bot taunts and attacks a mob, it will attack the closest PC regardless if they damaged the mob. Is there a way to stop this default switch to a PC over an NPC? thanks

-Mac

kajika 09-10-2008 02:34 AM

Quote:

Originally Posted by macvaliant7 (Post 155549)
I installed the 1129 update pack and the latest EQOffline binaries/dll the problem i have is even though the warrior bot taunts and attacks a mob, it will attack the closest PC regardless if they damaged the mob. Is there a way to stop this default switch to a PC over an NPC? thanks

-Mac

I use this patch.

diff -r -c -N ./1129Bots/zone/hate_list.cpp ./1129Bots-changed/zone/hate_list.cpp
*** ./1129Bots/zone/hate_list.cpp 2008-06-19 05:49:00.000000000 +0900
--- ./1129Bots-changed/zone/hate_list.cpp 2008-09-05 14:33:16.000000000 +0900
***************
*** 240,246 ****

sint32 currentHate = cur->hate;

! if(cur->ent->IsClient()){

if(cur->ent->CastToClient()->IsSitting()){
aggroMod += RuleI(Aggro, SittingAggroMod);
--- 240,246 ----

sint32 currentHate = cur->hate;

! if(cur->ent->IsClient() || cur->ent->IsBot()){

if(cur->ent->CastToClient()->IsSitting()){
aggroMod += RuleI(Aggro, SittingAggroMod);
***************
*** 292,298 ****
iterator.Advance();
}

! if(topClientInRange != NULL && top != NULL && !top->IsClient())
return topClientInRange;
else
return top;
--- 292,298 ----
iterator.Advance();
}

! if(topClientInRange != NULL && top != NULL && !top->IsClient() && !top->IsBot())
return topClientInRange;
else
return top;

macvaliant7 09-10-2008 05:25 AM

Make
 
I can edit the cpp file easily but i can't get them to compile(make a new zone.exe) with the makefile (shared memory error: shm_r and shm_w undeclared). Could i get the updated zone.exe somewhere?

Thanks,
-Mac

Angelox 09-10-2008 07:51 AM

I think that's the way the game works - stand away from the fight and the mob stays on the tank. Also, if a caster heals or DDs, he gets aggro.
And finally, The bots are rooting - a rooted mob will attack the one nearest.

gygelly 09-10-2008 10:50 AM

the problem arises if you are using a PC monk or rogue with a bot tank.
the way I always understood it working, with player characters, when a mob is rooted, was that the npc would attack whichever PC was closest.

So I figure the problem is that the bot tank always stands at the maximum melee range. We need the bot tank to move up close to a mob, like a pc tank, so that monks and rogues can stay at maximum melee range and not get attacked.

Congdar 09-10-2008 12:17 PM

try changing your server rule Aggro:SmartAggroList = false
this works best for the bots

Ikeren 09-10-2008 01:01 PM

When using assist to heal against Derek the Vindicator, I found that he spent the entire battle killing the pets. I haven't had time to check this against other raid mobs. Pets get closer then NPC's when attacking, don't they?

macvaliant7 09-10-2008 03:26 PM

I tested it out before i posted. I walked into the mob, and summoned the bot to me, thus sticking him right on the mob, yet it still chose me (at max melee range) over the bot right up on it. If i root the mob then, it WILL attack the bot instead of me (until root wears off) but even if that is how LIVE worked, that is impractical for eqemu and will not work on raid mobs.

Congdar 09-16-2008 12:16 PM

Quote:

Originally Posted by macvaliant7 (Post 155590)
I tested it out before i posted. I walked into the mob, and summoned the bot to me, thus sticking him right on the mob, yet it still chose me (at max melee range) over the bot right up on it. If i root the mob then, it WILL attack the bot instead of me (until root wears off) but even if that is how LIVE worked, that is impractical for eqemu and will not work on raid mobs.

The default aggro targeting (Aggro:SmartAggroList=true) favors PC's over Pets(npc's) and since Bots are npc's then it makes sense that you would be the primary target. Add the rule to your rules_values database table Aggro:SmartAggroList=false to solve this. Don't forget to make sure the ruleset_id in the rule_sets table matches the ruleset_id in the rules_values table.

Warleggon 09-18-2008 02:46 AM

Problem with World.exe
 
Hi :)

I've just joined the ranks a few days ago, and am really excited about what I see I can do with EQEm. When I got onto a couple of servers that had bots. I was absolutly thrilled. I have three autistic childern who would love to be able to play this version of EQ with customized quests and the idea of bots is perfect for my oldest boy...but on all this I digress.

I used the pdf to install the server and client. I got the server to go up on the public realm no problem. (Awsome set of instructions) I had a little trouble with Minilogin, but after looking at the support forum for that I finally got that figured. Point is this is an installation that is 3 days old. I made the backups, copied the executables, and ran the mysql statments. (got errors that the tables already exist by the way) and copied the npc item table, then emptied it and copied in the data. *deep breath

When I started things up the first thing I noticed was that world.exe spit out a bunch of errors.

Code:

[Debug] [RULES__ERROR] Unable to find rule 'World:UseBannedIPsTable'
[Debug] [RULES__ERROR] Unable to find rule 'World:MaxClientsPerIP'
[Debug] [RULES__ERROR] Unable to find rule 'World:ExemptMaxClientsStatus'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:PetSpellAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:SongAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:SpellAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:MinorNPCCorpseDecayTimeMS'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:MajorNPCCorpseDecayTimeMS'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:GraveyardTimeMS'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:EnableShadowrest'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZWhenLoading'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZAtWaypoints'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZWhenMoving'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZOnSendTo'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:ClientLinkdeadMS'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:UseItemBonusesForNonPets'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZMaxDeltaSendTo'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZMaxDeltaLoading'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZMaxDeltaMoving'
[Debug] [RULES__ERROR] Unable to find rule 'Map:FixPathingZMaxDeltaWaypoint'
[Debug] [RULES__ERROR] Unable to find rule 'Character:HealOnLevel'
[Debug] [RULES__ERROR] Unable to find rule 'Character:FeignKillsPet'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemManaRegenCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemHealthRegenCap'
[Debug] [RULES__ERROR] Unable to find rule 'Combat:UseIntervalAC'
[Debug] [RULES__ERROR] Unable to find rule 'Combat:PetAttackMagicLevel'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:SayPauseTimeInSec'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:OOCRegen'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:SmartAggroList'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:SittingAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:MeleeRangeAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:CurrentTargetAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:CriticallyWoundedAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:SlowAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:IncapacitateAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'Aggro:MovementImpairAggroMod'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:BuffFriends'
[Debug] [RULES__ERROR] Unable to find rule 'Character:DeathItemLossLevel'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:CheckWaypointsInWaterWhenLoading'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:CheckForWaterAtWaypoints'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:CheckForWaterWhenMoving'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:CheckForWaterOnSendTo'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:CheckForWaterWhenFishing'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:FishingRodLength'
[Debug] [RULES__ERROR] Unable to find rule 'Watermap:FishingLineLength'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemDamageShieldCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemAccuracyCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemAvoidanceCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemCombatEffectsCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemShieldingCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemSpellShieldingCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemDoTShieldingCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemStunResistCap'
[Debug] [RULES__ERROR] Unable to find rule 'Character:ItemStrikethroughCap'
[Debug] [RULES__ERROR] Unable to find rule 'Spells:PartialHitChanceFear'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQWarpExemptStatus'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQZoneExemptStatus'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQGateExemptStatus'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQGhostExemptStatus'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:EnableMQWarpDetector'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:EnableMQZoneDetector'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:EnableMQGateDetector'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:EnableMQGhostDetector'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQWarpDetectorDistance'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQWarpLagThreshold'
[Debug] [RULES__ERROR] Unable to find rule 'Zone:MQWarpThresholdTimer'
[Debug] [RULES__ERROR] Unable to find rule 'Combat:EnableFearPathing'
[Debug] [RULES__ERROR] Unable to find rule 'Combat:FleeHPRatio'
[Debug] [RULES__ERROR] Unable to find rule 'Combat:FleeIfNotAlone'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:EnableNPCQuestJournal'
[Debug] [RULES__ERROR] Unable to find rule 'Character:SkillUpModifier'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:CorpseUnlockTimer'
[Debug] [RULES__ERROR] Unable to find rule 'NPC:EmptyNPCCorpseDecayTimeMS'

I took out the unable to interpert the rule line for brevity...hehe. I was planning on adding the rules, but got to thinking that I may not know how to format the field appropriately, and wanted to ask for help.

nosfentora 09-18-2008 08:17 AM

Which database are you running? PEQ or Angelox?

If you're using PEQ, there should be 2 .sql files rule_values.sql and rule_sets.sql

if you source both of those, that should fix the unable to find rule errors.

Warleggon 09-18-2008 02:57 PM

Thanks nosfentora. I am using peq cvs'd from about one day ago. I found that if I use Congdar's 9/3/2008 release, then all my errors and other general performance problems went away. I had used the build that came off of Margoth78's site the first time.

hayward6 09-24-2008 09:52 PM

I spent a little time today setting this up with all the newest source and I don't seem to have the commands available when I log in... I know the commands aren't in the database, but maybe they aren't supposed to be? basicaly I just get "command unrecognized" when I try and do any #bot commands.

Congdar 09-24-2008 10:11 PM

you need to add EQBOTS to the preprocessor in Zone. It's different for linux and windows on how you set it, and both are already covered in this thread somewhere.

hayward6 09-25-2008 11:50 AM

Quote:

Originally Posted by Congdar (Post 156822)
you need to add EQBOTS to the preprocessor in Zone. It's different for linux and windows on how you set it, and both are already covered in this thread somewhere.

Thanks, I'll start digging through this thread when I have more time. I better pack a lunch :)

hayward6 09-25-2008 05:51 PM

If anyone know what I need could you please let me know? I just went through this thread front to back and didn't see anything about adding the commands. Of course I was going cross eyed around page 30 :) I just don't have the commands and everything I have downloaded was lacking them as well.

Thank you,

Congdar 09-25-2008 06:52 PM

Substitute EQBOTS for SPELL_EFFECT_SPAM in the instructions below and these will work for VS2005/2008 for windows compiles. If you are compiling on linux it's different.

Quote:

Originally Posted by Congdar (Post 155411)
I had this enabled at one time for windows.

1. In VC2005, right click on the Zone section and select Properties.
2. On the left side of the Zone Property Pages window select the C/C++ Preprocessor section under Configuration Properties.
3. On the right side of the Zone Property Pages window select Preprocessor Settings, these are the compiler settings.
4. Click on the tiny button on the right end of the Preprocessor Settings to open the Preprocessor Definitions window.
5. Edit SPELL_EFFECT_SPAM into its own line at the top of the list of compiler options.
6. Select OK to exit the Preprocessor Definitions window.
7. Select OK to exit the Zone Property Pages window.
8. Rebuild the executables.


hayward6 09-25-2008 09:37 PM

Quote:

Originally Posted by Congdar (Post 156922)
Substitute EQBOTS for SPELL_EFFECT_SPAM in the instructions below and these will work for VS2005/2008 for windows compiles. If you are compiling on linux it's different.

Yeah, I'm running Linux

Flare83 09-25-2008 09:49 PM

I'm trying to compile but i'm getting this error =*(

Code:

Generating Code...
Linking...
npc.obj : error LNK2019: unresolved external symbol "public: void __thiscall Mob::PET_Process(void)" (?PET_Process@Mob@@QAEXXZ) referenced in function "public: virtual bool __thiscall NPC::Process(void)" (?Process@NPC@@UAE_NXZ)
.\../Build/Zone.exe : fatal error LNK1120: 1 unresolved externals
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://e:\EQEmu\Build\Zone\Release\BuildLog.htm"
Zone - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Congdar 09-26-2008 09:52 AM

I don't know the linux commands but the botai.cpp, botraids.cpp, botraids.h and petai.cpp need to be added to the project.

Andrew80k 09-26-2008 10:32 AM

Quote:

Originally Posted by Flare83 (Post 156928)
I'm trying to compile but i'm getting this error =*(

Code:

Generating Code...
Linking...
npc.obj : error LNK2019: unresolved external symbol "public: void __thiscall Mob::PET_Process(void)" (?PET_Process@Mob@@QAEXXZ) referenced in function "public: virtual bool __thiscall NPC::Process(void)" (?Process@NPC@@UAE_NXZ)
.\../Build/Zone.exe : fatal error LNK1120: 1 unresolved externals
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://e:\EQEmu\Build\Zone\Release\BuildLog.htm"
Zone - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Look on page 26 of this thread, post 381 and 382. That might get you going.

Angelox 09-26-2008 01:19 PM

I downloaded one of these kits posted here; Kits were made opyrus , I have the VS2008 one, never had any problems.
I copy pasted my source/zone, world, etc. from my Linux machine which has bot code, and it all still worked fine.
Someone needs to sticky this thread, this install really works well.
The only thing you have to keep in mind is not the change/overwrite the /source/server.sln that comes with the package.

Flare83 09-26-2008 01:44 PM

Quote:

Originally Posted by Angelox (Post 156979)

I copy pasted my source/zone, world, etc. from my Linux machine which has bot code, and it all still worked fine.

The only thing you have to keep in mind is not the change/overwrite the /source/server.sln that comes with the package.


Thanks angelox =)

spider661 09-28-2008 08:41 PM

ok i found the problem i was having with groups not sticking after zoneing its in my bot code can anyone see if they can help me fix it? what happens is they zone and stay in group but it seems its clearing them from the database or the group itself.. then when they zone back into the zone it kills the group and everyone has to reform.

Code:

void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {

#ifdef EQBOTS

        // EQoffline: Remove the group if the leader is grouped
        Mob *clientmob = CastToMob();
        if(clientmob) {
                int16 cmid = clientmob->GetID();
                if(clientmob->IsBotRaiding()) {
                        BotRaids* br = entity_list.GetBotRaidByMob(clientmob);
                        if(br) {
                                br->RemoveRaidBots();
                                br = NULL;
                        }
                }
                if(clientmob->IsGrouped()) {
                        Group *g = entity_list.GetGroupByMob(clientmob);
                        if(g) {
                                for(int i=5; i>=0; i--) {
                                        if(g->members[i] && g->members[i]->IsBot()) {
                                                g->members[i]->Kill();
                                        }
                                }
                                if(g->BotGroupCount() <= 1) {
                                        g->DisbandGroup();
                                }
                        }
                }
                database.CleanBotLeader(cmid);
        }

#endif //EQBOTS

        zoning = true;
        if (app->size != sizeof(ZoneChange_Struct)) {
                LogFile->write(EQEMuLog::Debug, "Wrong size: OP_ZoneChange, size=%d, expected %d", app->size, sizeof(ZoneChange_Struct));
                return;
        }

#if EQDEBUG >= 5
        LogFile->write(EQEMuLog::Debug, "Zone request from %s", GetName());
        DumpPacket(app);
#endif
        ZoneChange_Struct* zc=(ZoneChange_Struct*)app->pBuffer;

        uint16 target_zone_id = 0;
        ZonePoint* zone_point = NULL;

        //figure out where they are going.
        if(zc->zoneID == 0) {
                //client dosent know where they are going...
                //try to figure it out for them.
               
                switch(zone_mode) {
                case EvacToSafeCoords:
                case ZoneToSafeCoords:
                        //going to safe coords, but client dosent know where?
                        //assume it is this zone for now.
                        cheat_timer.Start(35000,false);
                        target_zone_id = zone->GetZoneID();
                        break;
                case GMSummon:
                        target_zone_id = zonesummon_id;
                        break;
                case GateToBindPoint:
                        target_zone_id = m_pp.binds[0].zoneId;
                        break;
                case ZoneToBindPoint:
                        target_zone_id = m_pp.binds[0].zoneId;
                        break;
                case ZoneSolicited:  //we told the client to zone somewhere, so we know where they are going.
                        cheat_timer.Start(35000,false);
                        target_zone_id = zonesummon_id;
                        break;
                case ZoneUnsolicited:  //client came up with this on its own.
                        zone_point = zone->GetClosestZonePointWithoutZone(GetX(), GetY(), GetZ(), ZONEPOINT_NOZONE_RANGE);
                        if(zone_point) {
                                //we found a zone point, which is a reasonable distance away
                                //assume that is the one were going with.
                                target_zone_id = zone_point->target_zone_id;
                        } else {
                                //unable to find a zone point... is there anything else
                                //that can be a valid un-zolicited zone request?
                               
                                CheatDetected(MQZone);
                                Message(13, "Invalid unsolicited zone request.");
                                LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%d'.", GetName(), target_zone_id);
                                SendZoneCancel(zc);
                                return;
                        }
                        break;
                };
        }
        else {
                // This is to allow both 6.2 and Titanium clients to perform a proper zoning of the client when evac/succor
                // WildcardX 27 January 2008
                if(zone_mode == EvacToSafeCoords && zonesummon_id > 0)
                        target_zone_id = zonesummon_id;
                else
                target_zone_id = zc->zoneID;
               
                //if we are zoning to a specific zone unsolicied,
                //then until otherwise determined, they must be zoning
                //on a zone line.
                if(zone_mode == ZoneUnsolicited) {
                        zone_point = zone->GetClosestZonePoint(GetX(), GetY(), GetZ(), target_zone_id, ZONEPOINT_ZONE_RANGE);
                        //if we didnt get a zone point, or its to a different zone,
                        //then we assume this is invalid.
                        if(!zone_point || zone_point->target_zone_id != target_zone_id) {
                                Message(13, "Invalid unsolicited zone request.");
                                LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%d'.", GetName(), target_zone_id);
                                if ((cheat_timer.GetRemainingTime())<1 || (!cheat_timer.Enabled())){ //Lieka:  Disable MQGate Detector if timer is active.
                                        CheatDetected(MQGate);
                                }                                       
                                SendZoneCancel(zc);
                                return;
                        }
                }
        }


        //make sure its a valid zone.
        const char *target_zone_name = database.GetZoneName(target_zone_id);
        if(target_zone_name == NULL) {
                //invalid zone...
                Message(13, "Invalid target zone ID.");
                LogFile->write(EQEMuLog::Error, "Zoning %s: Unable to get zone name for zone id '%d'.", GetName(), target_zone_id);
                SendZoneCancel(zc);
                return;
        }

        //load up the safe coords, restrictions, and verify the zone name
        float safe_x, safe_y, safe_z;
        sint16 minstatus = 0;
        int8 minlevel = 0;
        char flag_needed[128];
        if(!database.GetSafePoints(target_zone_name, &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) {
                //invalid zone...
                Message(13, "Invalid target zone while getting safe points.");
                LogFile->write(EQEMuLog::Error, "Zoning %s: Unable to get safe coordinates for zone '%s'.", GetName(), target_zone_name);
                SendZoneCancel(zc);
                return;
        }

#ifdef EMBPERL
                char buf[10];
                snprintf(buf, 9, "%d", target_zone_id);
                buf[9] = '\0';
                ((PerlembParser*)parse)->Event(EVENT_ZONE, 0, buf, (NPC*)NULL, this);
#endif

        //handle circumvention of zone restrictions
        //we need the value when creating the outgoing packet as well.
        int8 ignorerestrictions = zonesummon_ignorerestrictions;
        zonesummon_ignorerestrictions = 0;

        float dest_x=0, dest_y=0, dest_z=0, dest_h;
        dest_h = GetHeading();
        switch(zone_mode) {
        case EvacToSafeCoords:
        case ZoneToSafeCoords:
                LogFile->write(EQEMuLog::Debug, "Zoning %s to safe coords (%f,%f,%f) in %s (%d)", GetName(), safe_x, safe_y, safe_z, target_zone_name, target_zone_id);
                dest_x = safe_x;
                dest_y = safe_y;
                dest_z = safe_z;
                break;
        case GMSummon:
                dest_x = zonesummon_x;
                dest_y = zonesummon_y;
                dest_z = zonesummon_z;
                ignorerestrictions = 1;
                break;
        case GateToBindPoint:
                dest_x = m_pp.binds[0].x;
                dest_y = m_pp.binds[0].y;
                dest_z = m_pp.binds[0].z;
                break;
        case ZoneToBindPoint:
                dest_x = m_pp.binds[0].x;
                dest_y = m_pp.binds[0].y;
                dest_z = m_pp.binds[0].z;
                ignorerestrictions = 1;        //can always get to our bind point? seems exploitable
                break;
        case ZoneSolicited:  //we told the client to zone somewhere, so we know where they are going.
                //recycle zonesummon variables
                cheat_timer.Start(3500,false);
                dest_x = zonesummon_x;
                dest_y = zonesummon_y;
                dest_z = zonesummon_z;
                break;
        case ZoneUnsolicited:  //client came up with this on its own.
                //client requested a zoning... what are the cases when this could happen?
               
                //Handle zone point case:
                if(zone_point != NULL) {
                        //they are zoning using a valid zone point, figure out coords
                       
                        //999999 is a placeholder for 'same as where they were from'
                        if(zone_point->target_x == 999999)
                                dest_x = GetX();
                        else
                                dest_x = zone_point->target_x;
                        if(zone_point->target_y == 999999)
                                dest_y = GetY();
                        else
                                dest_y = zone_point->target_y;
                        if(zone_point->target_z == 999999)
                                dest_z=GetZ();
                        else
                                dest_z = zone_point->target_z;
                        if(zone_point->target_heading == 999)
                                dest_h = GetHeading();
                        else
                                dest_h = zone_point->target_heading;
                       
                        break;
                }
               
                //for now, there are no other cases...
               
                //could not find a valid reason for them to be zoning, stop it.
                CheatDetected(MQZone);
                Message(13, "Invalid unsolicited zone request.");
                LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%s'. Not near a zone point.", GetName(), target_zone_name);
                SendZoneCancel(zc);
                return;
        };

        //OK, now we should know where were going...

        //Check some rules first.
        sint8 myerror = 1;                //1 is succes

        //not sure when we would use ZONE_ERROR_NOTREADY

        //enforce min status and level
        if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel)) {
                cheat_timer.Start(3500,false); //Lieka:  Don't set off warp detector for when a player is moved to the safe-spot for trying to access a zone without the appropriate level or status requirements (i.e. zoning into FearPlane at level 30, etc)
                myerror = ZONE_ERROR_NOEXPERIENCE;
                }
       
        if(!ignorerestrictions && flag_needed[0] != '\0') {
                //the flag needed string is not empty, meaning a flag is required.
                if(Admin() < minStatusToIgnoreZoneFlags && !HasZoneFlag(target_zone_id)) {
                        Message(13, "You must have the flag %s to enter this zone.");
                        myerror = ZONE_ERROR_NOEXPERIENCE;
                        cheat_timer.Start(3500,false);
                }
        }
       
        //Enforce ldon doungeon entrance rules
        if(myerror == 1 && database.IsLDoNDungeon(target_zone_id)
        // && !ignorerestrictions
        ) {
                //this zone is an ldon dungeon
                int advid = GetAdventureID();
                if(advid > 0){
                        //we are in an adventure... make sure its the right one
                        AdventureInfo ai = database.GetAdventureInfo(advid);
                        if(target_zone_id != ai.zonedungeonid) {
                                Message(13, "You are not allowed to enter this dungeon!");
                                LogFile->write(EQEMuLog::Error, "Zoning %s: Not allowed to enter dungeon '%s' (%d). Not in the right adventure.", GetName(), target_zone_name, target_zone_id);
                                SendZoneCancel(zc);
                                return;
                        }
                } else {
                        Message(13, "You are not allowed to enter this dungeon!");
                        LogFile->write(EQEMuLog::Error, "Zoning %s: Not allowed to enter dungeon '%s' (%d). Not in any adventure.", GetName(), target_zone_name, target_zone_id);
                        SendZoneCancel(zc);
                        return;
                }
        }

        if(myerror == 1) {
                //we have successfully zoned
                DoZoneSuccess(zc, target_zone_id, dest_x, dest_y, dest_z, dest_h, ignorerestrictions);
        } else {
                LogFile->write(EQEMuLog::Error, "Zoning %s: Rules prevent this char from zoning into '%s'", GetName(), target_zone_name);
                SendZoneError(zc, myerror);
        }
}

the problem is the remove bots call if i comment it out and don't have bots the group stays intact if i have bots it destroys the group on zoneing and leaves the bots in the last zone.

so i cant just comment it out i have to fix it.

any suggestions?

Congdar 09-28-2008 09:23 PM

If you have more than one PC in the group, the Bots should be invited last. Maybe that will help with the group issue.

The bots have been coded such that they cannot zone with you because it would crash the zone when I tried. It was easier for me to make it that way than to figure out how to make them zone with you. If you really want to make bots zone with you there's a ton of other zone/teleport/group teleport code that will need to be changed as well. I recommend living with this restriction.

spider661 09-28-2008 09:34 PM

no thats not it.. i don't care if they zone or not.. the problem is this code is making it so when you zone.. with or without a bot. and your grouped. then your group breaks up. i think its removing you from the new group ids database and not adding you back with or without a bot.

example.. your in a group no bots and die.. your still in group but then you zone back to rejoin your group the group is disbanded and you have to reform.. i tried with all the bot code removed and the code for groups works add it back and it breaks.. remove this peace and it works but if you have bots it breaks the group soon as you zone.

Congdar 09-28-2008 11:16 PM

ok, thanks for clearing that up... try this and let me know if it works. Just replace the entire ifdef
Code:

#ifdef EQBOTS

        // EQoffline: Remove the group if the leader is grouped
        Mob *clientmob = CastToMob();
        if(clientmob) {
                int16 cmid = GetID();
                if(clientmob->IsBotRaiding()) {
                        BotRaids* br = entity_list.GetBotRaidByMob(clientmob);
                        if(br) {
                                br->RemoveRaidBots();
                                br = NULL;
                        }
                }
                if(clientmob->IsGrouped()) {
                        Group *g = entity_list.GetGroupByMob(clientmob);
                        if(g) {
                                bool hasBots = false;
                                for(int i=5; i>=0; i--) {
                                        if(g->members[i] && g->members[i]->IsBot()) {
                                                hasBots = true;
                                                g->members[i]->Kill();
                                        }
                                }
                                if(hasBots) {
                                        if(g->BotGroupCount() <= 1) {
                                                g->DisbandGroup();
                                        }
                                }
                        }
                }
                database.CleanBotLeader(cmid);
        }

#endif //EQBOTS



All times are GMT -4. The time now is 10:29 AM.

Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.