PDA

View Full Version : Player-Made ornamentations


Leetsauce
04-07-2015, 10:28 AM
This is a quest that will allow a player to turn in any weapon (or item for that matter, you can tailor this quest to your servers needs, but for this example we're using a weapon, and a weapon graphic) into an augment that fits into the 6th slot of your weapons so as to act as an ornamentation. I have tested this on my server and it works though I am sure it can be cleaned up a bit. I am not the original author of the majority of this code. I have mainly just updated the columns, and added some definitions for customization for my own server. Credit goes to Sonikboom from: http://www.eqemulator.org/forums/showthread.php?t=33666

#!/usr/bin/perl
use DBI;


#database configuration information
$db="database";
$host="serverip";
$user="username";
$password="password";

#connect to MySQL database
my $dbh = DBI->connect ("DBI:mysql:database=$db:host=$host", $user, $password);

sub EVENT_SAY
{
my $workOrders = quest::saylink("Work orders", 1);
my $redeem = quest::saylink("Redeem ornamentations", 1);
if($text=~/Hail/i)
{
plugin::Whisper("I am the only one in the stable area who can transmute a weapon you have into an ornamentation. I work the same way the others do, but my magic will ONLY work on weapons. When I perform this service, you will provide me a weapon along with the correct payment, and roughly 24 hours later I will have your tailor-made ornamentation ready to use. These ornamentations can only be inserted into the ornamentation slot on your weapon by users of newer clients. After inserting you may return to an older client and maintain the graphic and additional benefit from the ornamentation. If you would like to check your work " . quest::saylink("orders",1 ) . ", or if you wish to redeem any finished items, click " . quest::saylink("redeem ornamentations",1, "redeem") . ".") ;
}

if($text=~/orders/i)
{
#Get current work orders that need to be fulfilled for player.
my $workorders = $dbh->prepare( "SELECT * from augment_work_orders where player_id = '$charid'");
$workorders->execute( );

my $hasWorkOrder = false;
while ( my @workorderrow = $workorders->fetchrow_array( ) ) {
$hasWorkOrder = true;
my $newAugId = @workorderrow[2];

#get the stats for this augment
my $workOrderItem = $dbh->prepare("SELECT * from items_augs where id = '$newAugId'");
$workOrderItem->execute();
my @row = $workOrderItem->fetchrow_array();

#display information to the client about their item
plugin::Whisper("--------$row[2]:---------'");
plugin::Whisper("Damage: $row[51], Delay: $row[54]") ;
plugin::Whisper("HP: $row[77], Mana: $row[90]") ;
plugin::Whisper("Mana Regen: $row[91], HP Regen: $row[78]") ;
plugin::Whisper("AC: $row[4], ATK: $row[12]");
plugin::Whisper("STR: $row[11]") ;
plugin::Whisper("STA: $row[10]") ;
plugin::Whisper("AGI: $row[3]") ;
plugin::Whisper("DEX: $row[7]") ;
plugin::Whisper("WIS: $row[28]") ;
plugin::Whisper("INT: $row[8]") ;
plugin::Whisper("CHA: $row[6]") ;
plugin::Whisper("PR: $row[100]") ;
plugin::Whisper("MR: $row[96]") ;
plugin::Whisper("DR: $row[57]") ;
plugin::Whisper("FR: $row[73]") ;
plugin::Whisper("CR: $row[50]") ;
plugin::Whisper("Haste: $row[75]");
}

#if there weren't any work orders, tell them
if(!$hasWorkOrder)
{
plugin::Whisper("I currently do not have any work orders from you.");
}
}

if($text =~/Redeem ornamentations/i)
{
#get the augments that have been added long enough to go through a server restart
my $workorders = $dbh->prepare( "SELECT * from augment_work_orders where player_id = '$charid' and order_date != CURDATE();");
$workorders->execute( );
while ( my @workorderrow = $workorders->fetchrow_array( ) )
{
#give item to player
quest::summonitem(@workorderrow[2]);

#remove work order from the augment_work_order table
my $removeWorkOrder = $dbh->prepare( "delete from augment_work_orders where player_id = '$charid' and item_id = '$workorderrow[2]'");
$removeWorkOrder->execute( );
}
plugin::Whisper("I have nothing more to return to you at this time.");

}
}

sub EVENT_ITEM
{
#get the stats on each of the items given to the NPC
my $sth = $dbh->prepare( "SELECT * FROM items_augs where id = '$item1'");
$sth->execute( );

#create variables for all of the stats to be added together
my $dmg = 0;
my $delay = 0;
my $hp = 0;
my $regen = 0;
my $mana = 0;
my $manaregen = 0;
my $ac = 0;
my $atk = 0;
my $str = 0;
my $sta = 0;
my $agi = 0;
my $dex = 0;
my $wis = 0;
my $int = 0;
my $cha = 0;
my $pr = 0;
my $mr = 0;
my $dr = 0;
my $fr = 0;
my $cr = 0;
my $haste = 0;
my $augtype = 0;
my $spelldmg = 0;
my $healamt = 0;
my $ds = 0;
my $hstr = 0;
my $hsta = 0;
my $hagi = 0;
my $hdex = 0;
my $hwis = 0;
my $hint = 0;
my $hcha = 0;

#create variable to store tier (Used for pricing increases)
my $tier = 0;

while ( my @row = $sth->fetchrow_array( ) ) {
#increment stats for each item
$dmg = $dmg + $row[51];
$delay = $delay + $row[52];
$hp = $hp + $row[77];
$regen = $regen + $row[78];
$mana = $mana + $row[90];
$manaregen = $manaregen + $row[91];
$endurance = $row[62];
$ac = $ac + $row[4];
$atk = $atk + $row[12];
$str = $str + $row[11];
$sta = $sta + $row[10];
$agi = $agi + $row[3];
$dex = $dex + $row[7];
$wis = $wis + $row[28];
$int = $int + $row[8];
$cha = $cha + $row[6];
$pr = $pr + $row[100];
$mr = $mr + $row[96];
$dr = $dr + $row[57];
$fr = $fr + $row[73];
$cr = $cr + $row[50];
$haste = $haste + $row[75];
$augtype = 524288;
$slot = $row[112];
$spelldmg = $row[237]+50;
$healamt = $row[236]+50;
$clairvoyance = $row[238]+50;
$icon = $row[79];
$class = $row[44];
$proceffect = $row[145];
$procrate = $row[101];
$ds = $row[52]+50;
$hstr = $row[223]+1;
$hsta = $row[228]+1;
$hdex = $row[227]+1;
$hagi = $row[226]+1;
$hwis = $row[225]+1;
$hint = $row[224]+1;
$hcha = $row[229]+1;
$focuseffect = $row[72];
$worneffect = $row[150];
$worntype = $row[151];
$focustype = $row[155];
$loreitem = $row[2];
$elemdmg = $row[61];
$elemdmgtype = $row[60];
$skillmodtype = $row[110];
$skillmodvalue = $row[111];
$graphic = $row[80];

#determine the highest tier and set it as tear
if($row[253] > $tier)
{
$tier = $row[253];
}
}

#increment tier for new item
$tier = $tier + 1;

#pricing structure for stat types
$regularStatPrice = 10; #same and resists
$achpmanaPrice = 1000; #same
$hStatsCost = 5000; # heroics
$hasteCost = 100; #dmg and haste
$DmgregenCost = 2500; #mod2s

#calculate regular stats totals and add to cost
my $regularStats = $str + $sta + $agi + $dex + $wis + $int + $cha + $pr + $mr + $dr + $fr + $cr;
$cost = $regularStatPrice * $regularStats;

#calculate AC + HP + Mana totals and add to cost
my $achpmanaStats = $hp + $mana + $ac;
$cost = $cost + ($achpmanaStats * $achpmanaPrice);

#calculate resists totals and add to cost
my $hStats = $hstr + $hsta + $hagi + $hdex + $hwis + $hint + $cha;
$cost = $cost + ($hStatsCost * $hStats);

#calculate Haste totals and add to cost
my $hasteStat = $haste + $dmg;
$cost = $cost + ($hasteCost * $hasteStat);

#calculate DMG and Regen totals and add to cost
my $DmgregenStat = $regen + $manaregen + $spelldmg + $healamt + $dmgshield + $ds;
$cost = $cost + ($DmgregenCost * $DmgregenStat);


#multiply cost by tier to get final price
$cost = $cost * 13 ;
$cost = $cost * $tier; #tier is how many times the item has been turned in. price increases dramatically

#setmax
if($cost > 90000000) {
$cost = 90000000;
}

#display price to client
plugin::Whisper("The total cost to turn these items into an augment is $cost platinum pieces.") ;

#if they included the correct amount of money, create the item and the work order
if($platinum == $cost)
{
#insert statement for new item
my $newAugStatement = "INSERT INTO `peq`.`items_augs`(`id`,`minstatus`,`Name`,`aagi`, `ac`,`accuracy`,`acha`,`adex`,`aint`,`artifactflag `,`asta`,`astr`,`attack`,`augrestrict`,`augslot1ty pe`,`augslot1visible`,`augslot2type`,`augslot2visi ble`,`augslot3type`,`augslot3visible`,`augslot4typ e`,`augslot4visible`,`augslot5type`,`augslot5visib le`,`augslot6type`,`augslot6visible`,`augtype`,`av oidance`,`awis`,`bagsize`,`bagslots`,`bagtype`,`ba gwr`,`banedmgamt`,`banedmgraceamt`,`banedmgbody`,` banedmgrace`,`bardtype`,`bardvalue`,`book`,`castti me`,`casttime_`,`charmfile`,`charmfileid`,`classes `,`color`,`combateffects`,`extradmgskill`,`extradm gamt`,`price`,`cr`,`damage`,`damageshield`,`deity` ,`delay`,`augdistiller`,`dotshielding`,`dr`,`click type`,`clicklevel2`,`elemdmgtype`,`elemdmgamt`,`en dur`,`factionamt1`,`factionamt2`,`factionamt3`,`fa ctionamt4`,`factionmod1`,`factionmod2`,`factionmod 3`,`factionmod4`,`filename`,`focuseffect`,`fr`,`fv nodrop`,`haste`,`clicklevel`,`hp`,`regen`,`icon`,` idfile`,`itemclass`,`itemtype`,`ldonprice`,`ldonth eme`,`ldonsold`,`light`,`lore`,`loregroup`,`magic` ,`mana`,`manaregen`,`enduranceregen`,`material`, `herosforgemodel`,`maxcharges`,`mr`,`nodrop`,`nore nt`,`pendingloreflag`,`pr`,`procrate`,`races`,`ran ge`,`reclevel`,`recskill`,`reqlevel`,`sellrate`,`s hielding`,`size`,`skillmodtype`,`skillmodvalue`,`s lots`,`clickeffect`,`spellshield`,`strikethrough`, `stunresist`,`summonedflag`,`tradeskills`,`favor`, `weight`,`UNK012`,`UNK013`,`benefitflag`,`UNK054`, `UNK059`,`booktype`,`recastdelay`,`recasttype`,`gu ildfavor`,`UNK123`,`UNK124`,`attuneable`,`nopet`,` updated`,`comment`,`UNK127`,`pointtype`,`potionbel t`,`potionbeltslots`,`stacksize`,`notransfer`,`sta ckable`,`UNK134`,`UNK137`,`proceffect`,`proctype`, `proclevel2`,`proclevel`,`UNK142`,`worneffect`,`wo rntype`,`wornlevel2`,`wornlevel`,`UNK147`,`focusty pe`,`focuslevel2`,`focuslevel`,`UNK152`,`scrolleff ect`,`scrolltype`,`scrolllevel2`,`scrolllevel`,`UN K157`,`serialized`,`verified`,`serialization`,`sou rce`,`UNK033`,`lorefile`,`UNK014`,`svcorruption`,` UNK038`,`UNK060`,`augslot1unk2`,`augslot2unk2`,`au gslot3unk2`,`augslot4unk2`,`augslot5unk2`,`augslot 6unk2`,`UNK120`,`UNK121`,`questitemflag`,`UNK132`, `clickunk5`,`clickunk6`,`clickunk7`,`procunk1`,`pr ocunk2`,`procunk3`,`procunk4`,`procunk6`,`procunk7 `,`wornunk1`,`wornunk2`,`wornunk3`,`wornunk4`,`wor nunk5`,`wornunk6`,`wornunk7`,`focusunk1`,`focusunk 2`,`focusunk3`,`focusunk4`,`focusunk5`,`focusunk6` ,`focusunk7`,`scrollunk1`,`scrollunk2`,`scrollunk3 `,`scrollunk4`,`scrollunk5`,`scrollunk6`,`scrollun k7`,`UNK193`,`purity`,`evolvinglevel`,`clickname`, `procname`,`wornname`,`focusname`,`scrollname`,`ds mitigation`,`heroic_str`,`heroic_int`,`heroic_wis` ,`heroic_agi`,`heroic_dex`,`heroic_sta`,`heroic_ch a`,`heroic_pr`,`heroic_dr`,`heroic_fr`,`heroic_cr` ,`heroic_mr`,`heroic_svcorrup`,`healamt`,`spelldmg `,`clairvoyance`,`backstabdmg`,`created`,`elitemat erial`,`ldonsellbackrate`,`scriptfileid`,`expendab learrow`,`powersourcecapacity`,`bardeffect`,`barde ffecttype`,`bardlevel2`,`bardlevel`,`bardunk1`,`ba rdunk2`,`bardunk3`,`bardunk4`,`bardunk5`,`bardname `,`bardunk7`,`UNK214`)
( select max(id) + 1, '0', '$name`s Custom Ornamentation', '$agi', '$ac', '0', '$cha', '$dex', '$int', '0', '$sta','$str', '$atk', '0', '0', '1', '0', '1', '0', '1', '0','1', '0', '1', '0', '1', '$augtype', '0', '$wis', '0', '0', '0', '0','0', '0', '0', '0', '0', '0', '0', '0', '0', '','0', '$class', '4278190080', '0', '0', '0', '0', '$cr', '$dmg', '$ds','0', '0', '47001', '0', '$dr', '0', '0', '$elemdmgtype', '$elemdmg', '$endurance','0', '0', '0', '0', '0', '0', '0', '0', '', '$focuseffect','$fr', '0', '$haste', '0', '$hp', '$regen', '$icon', '$graphic', '0', '54','0', '16', '1', '0', '$name made this Ornamentation with $loreitem .', '0', '0', '$mana', '$manaregen', '0','0', '0', '0', '$mr', '0', '1', '0', '$pr', '$procrate', '65535', '0','0', '0', '0', '1', '0', '0', '$skillmodtype', '$skillmodvalue', '$slot', '-1','0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2010-09-11 11:23:49', '', '0', '1', '0', '0', '0', '0', '0', '', '0', '$proceffect', '0', '0', '0', '0', '$worneffect', '$worntype', '0', '0', '0', '$focustype', '0', '0', '0', '-1', '0', '0', '0', '0', NULL, '2009-04-10 17:38:02', NULL, '13THFLOOR', '0', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '-1', '0', '0', '0000000000000000000', '0', '', '-1', '0', '0', '0', '0', '', '-1', '0', '0', '0', '0', '0', '', '-1', '0', '0', '0', '0', '0', '', '-1', '0', '0', '0', '0', '0', '', '-1', '0', '0', '0', '', '', '', '', '', '0', '$hstr', '$hint', '$hwis', '$hagi', '$hdex', '$hsta', '$hcha', '0', '0', '0', '0', '0', '0', '$healamt', '$spelldmg', '$clairvoyance', '0', '20031014223933', '0', '70', '0', '0', '0', '-1', '0', '0', '0', '0', '0', '0', '0', '0', '', '-1', '$tier' from items_augs );";
my $createAug = $dbh->prepare("$newAugStatement");
$createAug->execute( );

#get the new items id
my $lastid = $dbh->prepare( ("SELECT id from items_augs order by id desc limit 1"));
$lastid->execute( );
my $newAugId = 0;
while ( my @row2 = $lastid->fetchrow_array( ) ) {
$newAugId = @row2[0];
}


#create new augment work order with newly created item
#has to work like this since items are not automatically added to the game when added in DB
my $workOrderCreate = $dbh->prepare("insert into `peq`.`augment_work_orders` (player_id, item_id, order_date) values ('$charid', '$newAugId', NOW());");
$workOrderCreate->execute();


#Notify the Player that the work order was successful
plugin::Whisper("Work order created successfully");
}else
{
plugin::return_items(\%itemcount);
}
}

I have a few of these on my server that allows players to turn in any piece of armor or weapon in the game and turn it into an aug, and the player chooses which slot the aug comes out as. So, from the quest we can tell it's simply running an insert query into a bogus table (note: i have mine pointed to table "items_augs" so as to prevent memory leaks by messing with the itemID column while the server is running) from which it is also reading the data (make a copy of your items table so as to allow the items to be read for correct stats) and applying the defaults I have pre-defined.

You can also tell from the script that there are customizations such as additional stats when this process takes place, and you can also see the "tier" field which is basically an inner-working "ranking" system which allows you to upgrade your newly-transformed-augment each time you turn it into one of these npc's. This also allows you to change aug slots of any given aug the player may already have. As an example with this particular script, if you hand in an augment into this npc it will turn it into a slot 20 (ornamentation slot) augment, and it will carry over the item_texture ID of a bag (this is the default graphic for augments) so when you apply it to any given weapon, that weapon will then appear as a bag, but will carry over any stats the augment previously had, and then apply a bonus that I have given for each increment.


If you have any questions, or need additional help getting it set up feel free to shoot me a PM and I can train you to the best of my ability on how to customize this.

Edit:

Before:
http://i59.tinypic.com/35bzhhv.png

After:
http://i57.tinypic.com/erkhas.png


Edit2: I should have mentioned before that I had run into issues previously with having this script use 2 separate tables from the database hence my suggestion for creating a duplicate table to which the script can write and from which can read as opposed to messing with your current, and in-force items table that is being used when the server is active. You may have better luck than I did, but this is the method that I was able to find that worked without too much intervention/change. Also, this is a super easy process for exporting from items_augs, and inserting them into items. It only requires you to find/replace some text and running a query that is produced by Heidi for you if you have the correct selection and export it as an Insert statement.

Figback65
04-07-2015, 06:46 PM
Nice!!!!! I will play with this later!

Akkadius
04-07-2015, 07:22 PM
A+ for sharing worthwhile work!!!

Mortow
04-26-2015, 12:52 PM
I have this working but I need a little help on a perl script to copy the newly created aug from the items_aug table to the items table. I plan on running a task to shutdown the server every morning, run the script and restart the server. I know I can do a statement like: perl augcreate.pl to actually execute the script but I am unsure as to the actual code to insert the new item. I add items all the time to my items table so I have to have the code increment the item id. Thanks in advance.

Leetsauce
04-26-2015, 01:15 PM
I do it manually a lot of the time because I'm always in a hurry trying to do shit in between reboots. With HeidiSQL which is built into the repack if you're using it, will allow you to export grid rows in the form of an insert statement, I copy it to clipboard and find_replace where table is items and change it to items_augs. Then run that query. This is basically the lazy way to do it =p

Mortow
04-26-2015, 03:34 PM
Not sure what I have messed up but every time I redeem an item, it gives me a small leather gorget (item# 2015) I assume this is pulling from the date on the work order and not the item id but looking at the code, I have no idea how to proceed.

javewow
08-02-2017, 07:20 PM
No one specifically tells us the order?
step 1 ?
step 2 ?
step 3 ?
step 4 ?
step 5 ?

THX

Leetsauce
08-02-2017, 11:32 PM
What do you mean? The order of operations? Look at the code...

javewow
08-03-2017, 01:17 AM
What do you mean? The order of operations? Look at the code...

Cannot work!

Do you need MYSQL to add tables?
---------------------------------------------

Or trouble you to

"Edge of Seething Hatred" and "Nightmare's Custom Omamentation" items

SQL list is available here for download

Such as:

INSERT INTO `items` () VALUES (737388, 0, 'Serpent\'s Seal', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '0', 65535, 4278190080, '0', 0, 0, 1000000, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, '', -1, 8, 0, 0, 0, 0, 0, 647, 'IT63', 0, 11, 0, 0, 0, 0, 'A finely made seal', 0, 1, 0, 0, 0, 0, 0, 0, 8, 1, 1, 0, 17, 0, 65535, 0, -15, 0, -20, 1, 0, 1, -1, 0, 0, -1, 0, 0, 0, 0, 1, 1000, 5, 0, 1, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, '2012-12-27 10:35:05', '', 0, 0, 0, 0, 20, 0, 1, '', 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, NULL, '2010-11-09 09:45:17', NULL, '13THFLOOR', 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, '0000000000000000000', 0, '', -1, 0, 0, 0, 0, '', -1, 0, 0, 0, 0, 0, '', -1, 0, 0, 0, 0, 0, '', -1, 0, 0, 0, 0, 0, '', -1, 0, 0, 0, 0, 0, 0, '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '2007-11-29 18:14:03', 0, 70, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, '', -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0);