Go Back   EQEmulator Home > EQEmulator Forums > Support > Support::Windows Servers

Support::Windows Servers Support forum for Windows EQEMu users.

 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
  #5  
Old 10-29-2012, 02:06 AM
c0ncrete's Avatar
c0ncrete
Dragon
 
Join Date: Dec 2009
Posts: 719
Default

this is a trimmed down version of the plugin i use to give a random item to an npc.

Code:
#!/usr/bin/perl

# select a random itemID and give to npc
# returns itemID added
sub GetRandomItem {

    # defult itemid
    my $itemID = 0;

    # get npc object from calling script
    my $npc = plugin::val('$npc');

    # bail if npc has no loot table
    if ( !$npc->GetLoottableID() ) {
        return 0;
    }

    # bail if missed chance for extra item
    # assuming mob level tops at 80, this should max our chance @ 10%
    if ( rand(100) > $npc->GetLevel() * .1 + .2 )
    {
        return 0;
    }

    # find valid item id to give to npc (attempts until it gets an item name)
    # 1001 is min and 132476 is max itemID in database at time of writing
    my $itemName = 0;
    until ($itemName) {
        $itemID   = int( rand(131475) + 1001 );
        $itemName = quest::getItemName($itemID);
    }

    # have npc equip item, where possible
    $npc->AddItem( $itemID, 1, 1 );
    $npc->Heal();

    return $itemID;

}

1;
this is a trimmed version of the python script i used to modify all of the existing script files. as it stands, it is set up to run from a folder i use to keep up to date with the latest svn located in the EQEmu folder along with the running Quests directory. it adds EVENT_COMBAT to all existing npc scripts where needed (which is where the loot is added), and simply modifies the event if it already exists.

Code:
import os, sys

written  = 0
modified = 0

zone   = ''
script = ''

def getScriptList(zone):
    script = []
    for entry in os.listdir(zone):
        if os.path.isdir(entry):
            continue
        script.append(entry)
    return script

def modEventCombat(content):
    # modifying or adding EVENT_COMBAT
    found = 0
    start = 0
    for idx, val in enumerate(content):
        if found:
            break
        if val.find('EVENT_COMBAT') > -1:
            found = 1
            start = idx
            if val.find('{') == -1:
                start = start+1
            break
    if found == 1:
        content.insert(start+1, '\tif($combat_state) { plugin::GetRandomItem(); }\n')
    else:
        content.insert(0, 'sub EVENT_COMBAT\n{\n\tif($combat_state) { plugin::GetRandomItem(); }\n\n')

def parseScript(script):
    global modified, written
    try:
        if(os.path.getmtime(script) < os.path.getmtime('..\\Quests\\' + script)):
            return
    except WindowsError:
        pass
    content = open(script).readlines()
    if os.path.split(script)[-1] not in ('player.pl'):
        modified = modified +1
        modEventDeath(content)
        modEventCombat(content)
        modEventItem(content)
    # writing new version of script to file
    print 'WRITING: ..\\Quests\\%s' % script
    written = written +1
    script = open('..\\Quests\\' + script, 'w')
    script.writelines(content)
    script.close()

for entry in os.listdir('.'):
    if not os.path.isdir(entry):
        print 'SKIPPING: %s [not a directory]' % entry
        continue
    if entry[0] == '.':
        print 'SKIPPING: %s [hidden directory]' % entry
        continue
    if entry in ('items', 'plugins', 'spells'):
        print 'SKIPPING: %s [excluded directory]' % entry
        continue
    zone = entry
    newz = os.path.join('..\\Quests', zone)
    try:
        os.stat(newz)
    except:
        os.mkdir(newz)
    print 'CURRENT ZONE: %s' % zone
    for script in getScriptList(zone):
        parseScript(os.path.join(zone, script))

print
print 'modified: %d' % modified
print 'written : %d' % written
Reply With Quote
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 11:46 PM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3