[Mod] Random Item Stats

Discussion in 'Mods & Lua Functions' started by Cykotitan, Jun 1, 2011.

  1. imkingran

    imkingran Learning everyday. Premium User

    Joined:
    Jan 15, 2014
    Messages:
    1,194
    Likes Received:
    359
    Best Answers:
    5
    Are you getting any errors in the console?

    Double check the code in this area, since I'm not using 0.4 so I'm not quite sure if it's written correctly:
    Code (Text):
    1.             local ammy = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    2.             if ammy then
    3.                 if ammy.itemid == bonusAmuletId then
    4.                     rate = rate * 1.5 -- If he's wearing the amulet then give him 50% extra chance
    5.                 end
    6.             end
    If you don't get any errors in the console then use the function print() to find out where the problem is:
    Code (Text):
    1. local bonusAmuletId = 11393
    2. function onKill(cid, target, damage, flags)
    3.     if( (damage == true or bit.band(flags, 1) == 1) and isMonster(target) )then -- 0.3/4
    4.         local v = getMonsterInfo(getCreatureName(target))
    5.         if( v and v.lookCorpse ~= 0 )then
    6.             local s = getCreatureStorage(cid, extra_loot_key) -- This will be (-1) since you're not using it so the addEvent will return 'rare' and not 's' [s == -1 and rate or s]
    7.             local ammy = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    8.             if ammy then
    9.                 print('Amulet found | Amulet ID: ' .. ammy.itemid) -- print
    10.                 if ammy.itemid == bonusAmuletId then
    11.                     rate = rate * 1.5 -- If he's wearing the amulet then give him 50% extra chance
    12.                 end
    13.             else
    14.                 print('Amulet not found') -- print
    15.             end
    16.             print('Rate: ' .. rate)
    17.             addEvent(dropLoot, 0, getThingPos(target), v, s == -1 and rate or s, getCreatureMaster(target), cid, target)
    18.         end
    19.     end
    20.     return true
    21. end
     
    zabuzo and newby like this.
  2. newby

    newby Member

    Joined:
    Jun 11, 2016
    Messages:
    65
    Likes Received:
    13
    Best Answers:
    0
    Bloody hell, thank you

    Your code was printing:
    Code (Text):
    1.  
    2. Amulet found | Amulet ID: 11393
    3. Rate: 1.5
    4. Amulet found | Amulet ID: 0
    5. Rate: 1.5
    6.  
    Thanks to imkingran i've fixed this and i would like to share to everybody
    @Extrodus
    You helps me, i would like to help you
    It should be to useful to blazera.net:

    Code (Text):
    1.  
    2. local bonusAmuletId = 11393
    3. function onKill(cid, target, damage, flags)
    4.     if( (damage == true or bit.band(flags, 1) == 1) and isMonster(target) )then -- 0.3/4
    5.         local v = getMonsterInfo(getCreatureName(target))
    6.         if( v and v.lookCorpse ~= 0 )then
    7.             local s = getCreatureStorage(cid, extra_loot_key) -- This will be (-1) since you're not using it so the addEvent will return 'rare' and not 's' [s == -1 and rate or s]
    8.             local ammy = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    9.             local rate = getConfigInfo('rateLoot')
    10.             if ammy.itemid ~= 0 then
    11.                 --print('Amulet found | Amulet ID: ' .. ammy.itemid) -- print
    12.                 if ammy.itemid == bonusAmuletId then
    13.                     rate = rate * 1.5 -- If he's wearing the amulet then give him 50% extra chance
    14.                 end
    15.             --else
    16.             --    print('Amulet not found') -- print
    17.             end
    18.             --print('Rate: ' .. rate)
    19.             addEvent(dropLoot, 0, getThingPos(target), v, s == -1 and rate or s, getCreatureMaster(target), cid, target)
    20.         end
    21.     end
    22.     return true
    23. end
    24.  
     
    imkingran and zabuzo like this.
  3. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
    @imkingran do you know how to remove percentage?
    http://pastebin.com/BvnDST54

    I mean
    Code (Text):
    1. You see a bone club (Atk:12, Def:8).
    Not more (its how working on script)
    Code (Text):
    1. You see a deadly bone club (Atk:12 +5, Def:8). [Attack: +38%]
    And be it (how i want)
    Code (Text):
    1. You see a deadly bone club (Atk:12 +38, Def:8). [Attack: +38]
    It's just change something here?
    I think is here, but idk and i scare to do some shits
    PHP:
    1.  
    2.                         local percent, new, tmp = math.random(n.percent[1] + (v.extra[1] or 0), n.percent[2] + (v.extra[2] or 0))
    3.                         -- hacks
    4.                         if( n.attr == 'duration' )then
    5.                             tmp = getItemInfo(f.transformEquipTo)
    6.                             if tmp.transformDeEquipTo ~= item then
    7.                                 break
    8.                             end
    9.                             new = round( tmp.decayTime * (1 + percent / 100) * 1000 )
    10.                         elseif( n.attr == 'attackSpeed' )then
    11.                             new = round( vocation_base_attackspeed / (1 + percent / 100) )
    12.                         elseif( n.attr == 'hitChance' ) then
    13.                             new = round(
    14.                                 f.hitChance == -1 and
    15.                                     percent
    16.                                 or
    17.                                     f.hitChance * (1 + percent / 100)
    18.                             )
    19.                         else
    20.                             new = round(
    21.                                 n.base and
    22.                                     f[n['attr']] + f[n['base']] * (percent / 100)
    23.                                 or
    24.                                     f[n['attr']] * (1 + percent / 100)
    25.                             )
    26.                             if( new == f[n[n.base and 'base' or 'attr']] )then -- no improvement
    27.                                 break
    28.                             end
    29.                         end
    30.                         doItemSetAttribute(tmpItem, n.attr:lower(), new)
    31.                         local name = getItemAttribute(tmpItem, 'name')
    32.                         if( v.attrNames or not name )then
    33.                             local name = (v.attrNames and used[#used] or k) .. ' ' .. (name or f.name)
    34.                            doItemSetAttribute(tmpItem, 'name', name)
    35.                             if( f.article ~= '' )then
    36.                                 local article = getArticle(name)
    37.                                 if( article ~= f.article )then
    38.                                     doItemSetAttribute(tmpItem, 'article', article)
    39.                                 end
    40.                             end
    41.                         end
    42.                         local desc = getItemAttribute(tmpItem, 'description') or f.description
    43.                         doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. '%]' .. (desc == '' and '' or '\n' .. desc))
    44.  
     
  4. imkingran

    imkingran Learning everyday. Premium User

    Joined:
    Jan 15, 2014
    Messages:
    1,194
    Likes Received:
    359
    Best Answers:
    5
    Didn't test buy try this: (edited from your pastebin link)

    Code (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <mod name="Random Item Stats" enabled="1">
    3. <config name="itemstats_conf"><![CDATA[
    4. -- //
    5.     extra_loot_key = 123 --: optional storage for higher loot rate
    6.     vocation_base_attackspeed = getVocationInfo(1).attackSpeed --: used for attackSpeed stat
    7. -- //
    8.  
    9. tiers, attr = {}, {}
    10.  
    11. tiers['rare'] = {
    12.     color = 66, -- color of 'RARE' text
    13.     extra = {0, 0},
    14.     attrNames = true, -- show attribute names instead of rare
    15.     chance = {
    16.         [1] = 10000,
    17.         [2] = 5000 -- chance for 2nd stat
    18.     }
    19. }
    20. tiers['epic'] = {
    21.     color = 35,
    22.     extra = {6, 8}, -- additional percent bonus
    23.     chance = {
    24.         [1] = 3333,
    25.         [2] = 25000
    26.     }
    27. }
    28. tiers['legendary'] = {
    29.     color = 149,
    30.     extra = {10, 20},
    31.     chance = {
    32.         [1] = 1000,
    33.         [2] = 100000 -- 2 bonuses always
    34.     }
    35. }
    36.  
    37. MELEE = 0
    38. DISTANCE = 1
    39. ARMOR = 2
    40. SHIELD = 3
    41. WAND = 4
    42. DURATION_RING = 5
    43. CHARGES = 6
    44.  
    45. --! attributes
    46. attr['quick'] = {
    47.     attr = 'attackSpeed',
    48.     name = 'Attack Speed',
    49.     percent = {25, 45},
    50.     usePercents = true,
    51.     types = {MELEE, DISTANCE, WAND}
    52. }
    53. attr['fortified'] = {
    54.     attr = 'extraDefense',
    55.     base = 'defense',
    56.     name = 'Defense',
    57.     percent = {25, 35},
    58.     usePercents = true,  
    59.     types = {MELEE, SHIELD}
    60. }
    61. attr['deadly'] = {
    62.     attr = 'extraAttack',
    63.     base = 'attack',
    64.     name = 'Attack',
    65.     types = {MELEE},
    66.     usePercents = false,
    67.     percent = {25, 50}
    68. }
    69. attr['strong'] = {
    70.     attr = 'armor',
    71.     name = 'Armor',
    72.     percent = {25, 50},
    73.     usePercents = true,
    74.     types = {ARMOR}
    75. }
    76. attr['hawkeye\'s'] = {
    77.     attr = 'hitChance',
    78.     name = 'Hit Chance',
    79.     percent = {35, 55},
    80.     usePercents = true,
    81.     types = {DISTANCE}
    82. }
    83. --[[ // not available without source edit
    84. attr['farsight'] = {
    85.     attr = 'shootRange',
    86.     name = 'Shoot Range',
    87.     percent = {10, 20},
    88.     types = {DISTANCE, WAND}
    89. }
    90. ]]
    91. attr['charged'] = {
    92.     attr = 'charges',
    93.     name = 'Charges',
    94.     percent = {40, 80},
    95.     types = {CHARGES}
    96. }
    97. attr['divine'] = {
    98.     attr = 'duration',
    99.     name = 'Duration',
    100.     percent = {40, 80},
    101.     types = {DURATION_RING}
    102. }
    103. --/ attributes
    104.  
    105. rate = getConfigInfo('rateLoot')
    106.  
    107. if( getConfigInfo('monsterLootMessage') ~= 0 )then
    108.     print('[Notice] Set monsterLootMessage = 0 to prevent duplicate loot messages')
    109. end
    110. ]]></config>
    111.  
    112. <event type="kill" name="itemstats" event="script"><![CDATA[
    113. domodlib('itemstats_conf')
    114.  
    115. function round(n, s)
    116.     return tonumber(('%.' .. (s or 0) .. 'f'):format(n))
    117. end
    118.  
    119. function getContentDescription(uid, sep)
    120.     local ret, i, containers = '', 0, {}
    121.     while( i < getContainerSize(uid) )do
    122.         local v, s = getContainerItem(uid, i), ''
    123.         local k = getItemInfo(v.itemid)
    124.         k.name = getItemAttribute(v.uid, 'name') or k.name
    125.         if( k.name ~= '' )then
    126.             if( v.type > 1 and k.stackable and k.showCount )then
    127.                 s = v.type .. ' ' .. k.plural
    128.             else
    129.                 local article = getItemAttribute(v.uid, 'article') or k.article
    130.                 s = (article == '' and '' or article .. ' ') .. k.name
    131.             end
    132.             ret = ret .. (i == 0 and not sep and '' or ', ') .. s
    133.             if( isContainer(v.uid) and getContainerSize(v.uid) ~= 0 )then
    134.                 table.insert(containers, v.uid)
    135.             end
    136.         else
    137.             ret = ret .. (i == 0 and not sep and '' or ', ') .. 'an item of type ' .. v.itemid .. ', please report it to gamemaster'
    138.         end
    139.         i = i + 1
    140.     end
    141.     for i = 1, #containers do
    142.         ret = ret .. getContentDescription(containers[i], true)
    143.     end
    144.     return ret
    145. end
    146.  
    147. local function send(cid, corpse, monster)
    148.     if( isPlayer(cid) )then
    149.         local ret = corpse and isContainer(corpse) and getContentDescription(corpse)
    150.         doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'))
    151.         local party = getPlayerParty(cid)
    152.         if( party )then
    153.             for _, pid in ipairs(getPartyMembers(party)) do
    154.                 doPlayerSendChannelMessage(pid, '', 'Loot of ' .. monster .. ': ' .. (ret ~= '' and ret or 'nothing'), TALKTYPE_CHANNEL_W, CHANNEL_PARTY)
    155.             end
    156.         end
    157.     end
    158. end
    159.  
    160. local function createLoot(i, ext)
    161.     local item = type(i.id) == 'table' and i.id[math.random(#i.id)] or i.id
    162.     local random = math.ceil(math.random(100000) / ext)
    163.     local tmpItem, f
    164.  
    165.     if( random < i.chance )then
    166.         if i.subType == -1 then
    167.             f = getItemInfo(item)
    168.         end
    169.         tmpItem = doCreateItemEx(item,
    170.             i.subType ~= -1 and i.subType or
    171.             f.stackable and random % i.count + 1 or
    172.             f.charges ~= 0 and f.charges or
    173.             1
    174.         )
    175.     end
    176.  
    177.     if( not tmpItem )then
    178.         return
    179.     end
    180.  
    181.     if( i.actionId ~= -1 )then
    182.         doItemSetAttribute(tmpItem, 'aid', i.actionId)
    183.     end
    184.  
    185.     if( i.uniqueId ~= -1 )then
    186.         doItemSetAttribute(tmpItem, 'uid', i.uniqueId)
    187.     end
    188.  
    189.     if( i.text ~= '' )then
    190.         doItemSetAttribute(tmpItem, 'text', i.text)
    191.     end
    192.  
    193.     local ret, done
    194.  
    195.     for k, v in pairs(tiers) do
    196.         local cur, used = {}, {}
    197.         for i = 1, #v.chance do
    198.             if( math.random(100000) <= v.chance[i] )then
    199.                 if( f )then
    200.                     f = getItemInfo(item)
    201.                 end
    202.                 if( not f.stackable )then
    203.                     for m, n in pairs(attr) do
    204.                         if( not table.find(used, m) and
    205.                         (
    206.                             ( table.find(n.types, MELEE) and table.find({WEAPON_SWORD, WEAPON_CLUB, WEAPON_AXE}, f.weaponType) ) or
    207.                             ( table.find(n.types, DISTANCE) and f.weaponType == WEAPON_DIST and f.ammoType ~= 0 ) or
    208.                             ( table.find(n.types, ARMOR) and f.armor ~= 0 and f.wieldPosition ~= CONST_SLOT_NECKLACE ) or
    209.                             ( table.find(n.types, SHIELD) and f.defense ~= 0 and f.weaponType == WEAPON_SHIELD ) or
    210.                             ( table.find(n.types, WAND) and f.weaponType == WEAPON_WAND ) or
    211.                             ( table.find(n.types, DURATION_RING) and f.wieldPosition == CONST_SLOT_RING and f.transformEquipTo ~= 0 ) or
    212.                             ( table.find(n.types, CHARGES) and table.find({CONST_SLOT_RING, CONST_SLOT_NECKLACE}, f.wieldPosition) and f.charges ~= 0 )
    213.                         ) )then
    214.                             table.insert(cur, m)
    215.                         end
    216.                     end
    217.  
    218.                     if( #cur ~= 0 )then
    219.                         local n = cur[math.random(#cur)]
    220.                         table.insert(used, n)
    221.  
    222.                         n = attr[n]
    223.                         local percent, new, tmp = n.usePercents and math.random(n.percent[1] + (v.extra[1] or 0), n.percent[2] + (v.extra[2] or 0)) or math.random(n.percent[1] + (v.extra[1] or 0), n.percent[2] + (v.extra[2] or 0)) * 100
    224.                         -- hacks
    225.                         if( n.attr == 'duration' )then
    226.                             tmp = getItemInfo(f.transformEquipTo)
    227.                             if tmp.transformDeEquipTo ~= item then
    228.                                 break
    229.                             end
    230.                             new = round( tmp.decayTime * (1 + percent / 100) * 1000 )
    231.                         elseif( n.attr == 'attackSpeed' )then
    232.                             new = round( vocation_base_attackspeed / (1 + percent / 100) )
    233.                         elseif( n.attr == 'hitChance' ) then
    234.                             new = round(
    235.                                 f.hitChance == -1 and
    236.                                     percent
    237.                                 or
    238.                                     f.hitChance * (1 + percent / 100)
    239.                             )
    240.                         else
    241.                             new = round(
    242.                                 n.base and
    243.                                     f[n['attr']] + f[n['base']] * (percent / 100)
    244.                                 or
    245.                                     f[n['attr']] * (1 + percent / 100)
    246.                             )
    247.  
    248.                             if( new == f[n[n.base and 'base' or 'attr']] )then -- no improvement
    249.                                 break
    250.                             end
    251.                         end
    252.  
    253.                         doItemSetAttribute(tmpItem, n.attr:lower(), new)
    254.  
    255.                         local name = getItemAttribute(tmpItem, 'name')
    256.                         if( v.attrNames or not name )then
    257.                             local name = (v.attrNames and used[#used] or k) .. ' ' .. (name or f.name)
    258.                             doItemSetAttribute(tmpItem, 'name', name)
    259.  
    260.                             if( f.article ~= '' )then
    261.                                 local article = getArticle(name)
    262.                                 if( article ~= f.article )then
    263.                                     doItemSetAttribute(tmpItem, 'article', article)
    264.                                 end
    265.                             end
    266.                         end
    267.  
    268.                         local desc = getItemAttribute(tmpItem, 'description') or f.description
    269.                         if n.usePercents then
    270.                             doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. '%]' .. (desc == '' and '' or '\n' .. desc))
    271.                         else
    272.                             doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. ']' .. (desc == '' and '' or '\n' .. desc))
    273.                         end
    274.  
    275.                         ret = k
    276.                     end
    277.                     cur = {}
    278.                     if( #v.chance == i )then
    279.                         done = true
    280.                     end
    281.                 end
    282.             else
    283.                 done = i ~= 1
    284.                 break
    285.             end
    286.         end
    287.         if( done )then
    288.             break
    289.         end
    290.     end
    291.  
    292.     return tmpItem, ret
    293. end
    294.  
    295. local function createChildLoot(parent, i, ext, pos)
    296.     if( not i or #i == 0 )then
    297.         return true
    298.     end
    299.  
    300.     local size, cap = 0, getContainerCap(parent)
    301.     for k = 1, #i do
    302.         if( size == cap )then
    303.             break
    304.         end
    305.         local tmp, ret = createLoot(i[k], ext)
    306.         if( tmp )then
    307.             if( isContainer(tmp) )then
    308.                 if( createChildLoot(tmp, i[k].child, ext, pos) )then
    309.                     doAddContainerItemEx(parent, tmp)
    310.                     size = size + 1
    311.                 else
    312.                     doRemoveItem(tmp)
    313.                 end
    314.             else
    315.                 if( ret )then
    316.                     doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
    317.                     doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
    318.                 end
    319.                 doAddContainerItemEx(parent, tmp)
    320.                 size = size + 1
    321.             end
    322.         end
    323.     end
    324.  
    325.     return size > 0
    326. end
    327.  
    328. local function dropLoot(pos, v, ext, master, cid, target)
    329.     local corpse
    330.     if( not master or master == target )then -- 0.3/4
    331.         corpse = getTileItemById(pos, v.lookCorpse).uid
    332.         if( isContainer(corpse) )then
    333.             for i = 1, getContainerSize(corpse) do
    334.                 doRemoveItem(getContainerItem(corpse, 0).uid)
    335.             end
    336.             local size, cap = 0, getContainerCap(corpse)
    337.             for i = 1, #v.loot do
    338.                 if( size == cap )then
    339.                     break
    340.                 end
    341.                 local tmp, ret = createLoot(v.loot[i], ext)
    342.                 if( tmp )then
    343.                     if( isContainer(tmp) )then
    344.                         if( createChildLoot(tmp, v.loot[i].child, ext, pos) )then
    345.                             doAddContainerItemEx(corpse, tmp)
    346.                             size = size + 1
    347.                         else
    348.                             doRemoveItem(tmp)
    349.                         end
    350.                     else
    351.                         if( ret )then
    352.                             doSendMagicEffect(pos, CONST_ME_MAGIC_GREEN)
    353.                             doSendAnimatedText(pos, ret:upper(), tiers[ret].color)
    354.                         end
    355.                         doAddContainerItemEx(corpse, tmp)
    356.                         size = size + 1
    357.                     end
    358.                 end
    359.             end
    360.         end
    361.     end
    362.     send(cid, corpse, v.description)
    363. end
    364.  
    365. function onKill(cid, target, damage, flags)
    366.     if( (damage == true or bit.band(flags, 1) == 1) and isMonster(target) )then -- 0.3/4
    367.         local v = getMonsterInfo(getCreatureName(target))
    368.         if( v and v.lookCorpse ~= 0 )then
    369.             local s = getCreatureStorage(cid, extra_loot_key)
    370.             addEvent(dropLoot, 0, getThingPos(target), v, s == -1 and rate or s, getCreatureMaster(target), cid, target)
    371.         end
    372.     end
    373.     return true
    374. end
    375. ]]></event>
    376.  
    377. <event type="login" name="itemstats_login" event="buffer"><![CDATA[
    378.     registerCreatureEvent(cid, 'itemstats')
    379. ]]></event>
    380.  
    381. </mod>

    I added the option usePercents = boolean (true/false) to the table so you can decide which one use % and which one doesn't.
    Code (Text):
    1. attr['deadly'] = {
    2.     attr = 'extraAttack',
    3.     base = 'attack',
    4.     name = 'Attack',
    5.     types = {MELEE},
    6.     usePercents = false,
    7.     percent = {25, 50}
    8. }
     
    zabuzo likes this.
  5. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
    Wtf :O

    Code (Text):
    1.  
    2. 03:44 You see an epic longsword (Atk:17 +952, Def:14).
    3. It weighs 42.00 oz.
    4. [Attack: +5600]
    5. [Attack Speed: +48%]
    6.  
    7. 03:44 You see an epic short sword (Atk:11, Def:11 +418).
    8. It weighs 35.00 oz.
    9. [Defense: +3800]
    10.  
     
  6. gmstrikker

    gmstrikker Member

    Joined:
    Jul 30, 2014
    Messages:
    332
    Likes Received:
    16
    Best Answers:
    0
    There is something wrong here:
    Code (Text):
    1.  
    2.                        if n.usePercents then
    3.                             doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. '%]' .. (desc == '' and '' or '\n' .. desc))
    4.                         else
    5.                             doItemSetAttribute(tmpItem, 'description', '[' .. n.name .. ': +' .. percent .. ']' .. (desc == '' and '' or '\n' .. desc))
    6.                         end
    7.  
    I'm sorry, but i don't know how to fix
     
    zabuzo likes this.
  7. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
    @imkingran know? anybody know?
     
  8. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0


    Why +952 atk, +418 def in epic items?
    It shouldn't be 6~8

    Like is in the script?
    Code (Text):
    1.  
    2. tiers['epic'] = {
    3.     color = 35,
    4.     extra = {6, 8}, -- additional percent bonus
    5.     chance = {
    6.         [1] = 3333,
    7.         [2] = 25000
    8.     }
    9. }
    10.  
     
  9. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
  10. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
  11. zabuzo

    zabuzo Member

    Joined:
    Jun 10, 2016
    Messages:
    88
    Likes Received:
    5
    Best Answers:
    0
    bump it \/

     

Share This Page

Loading...