• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Znote monster_loot.php bags problem

Manigold

Active Member
Joined
Nov 2, 2017
Messages
197
Solutions
8
Reaction score
47
The page monster_loot.php works fine , but its not showing the loot that drops inside bags .
I'm using tfs 1.2
loot.png
The loot inside bags are shown correctly with old monsters file ,example:
XML:
  <item id="1987" chance="50000">  <!-- bag -->
    <inside>
      <item id="2148" countmax="100" chance1="100000" chancemax="0"/>
      <item id="2149" countmax="2" chance1="893" chancemax="0"/>
      <item id="2392" chance="1428"/>
      <item id="2146" countmax="2" chance1="3222" chancemax="0"/>
      <item id="2528" chance="2333"/>
    </inside>
  </item>
</loot>
with tfs 1.2 monster file doesn't work, the only diference is the < inside> < /inside> after bag
XML:
    <item id="1987" chance="100000"> <!-- bag -->
    <item id="2179" chance="1010" />
    <item id="2396" chance="1200" />
    <item id="2520" chance="2000" />
    <item id="2214" chance="473" />
    <item id="5906" countmax="1" chance="2000"/>
    <item id="5954" chance="2000" />
    <item id="2470" chance="1000" />
    <item id="2514" chance="1000" />
    <item id="2472" chance="660" />
    <item id="7393" chance="100" />
    <item id="7382" chance="1000" />
    </item>
</loot>


monster_loot.php
PHP:
<?php require_once 'engine/init.php'; include 'layout/overall/header.php'; ?>

<?php
###### MONSTER LOOT CHECKER ######
###### VERSION: 1.5

$otdir = 'misc/';

// In percent (highest first).
$rarity = array(
    'Not Rare'    => 7,
    'Semi Rare'    => 2,
    'Rare'        => 0.5,
    'Very Rare' => 0
);
?>
<script language="javascript">
     function toggleVisibility(obj) {
         var el = document.getElementById('d' + obj.id);
         var name = obj.innerHTML.substring(4);
      
         if(el.style.display == 'none') {
             obj.innerHTML = '[ -]';
             el.style.display = 'block';
         } else {
             obj.innerHTML = '[+]';
             el.style.display = 'none';
         }
         obj.innerHTML += ' ' + name;
     }
 </script> 

<?php
    if(isset($_GET['lootrate']))
        $add = '&lootrate';
    echo '<a href="' . htmlspecialchars($_SERVER['PHP_SELF'] . ($add ? '?lootrate' : '')) . '">Hide None</a> | ';
    echo '<a href="?hidefail' . $add . '">Hide Not Found</a> | ';
    echo '<a href="?hideempty' . $add . '">Hide Monsters Without Loot</a> | ';
    echo '<a href="?hideempty&hidefail' . $add . '">Hide All</a> | ';
    echo '<a href="monsters_loot.php">Use Normal Loot Rate</a> | ';
    echo '<a href="?lootrate">Use Server Loot Rate</a>';
?>
<br><br>
 

<?php
    $items = simplexml_load_file($otdir . '/data/items/items.xml') or die('<b>Could not load items!</b>');
    foreach($items->item as $v)
        $itemList[(int)$v['id']] = $v['name'];
    
    if(isset($_GET['lootrate'])) {
        $config = parse_ini_file($otdir . '/config.lua');
        $lootRate = $config['rate_loot'];
    }
 
    $monsters = simplexml_load_file($otdir . '/data/monster/monsters.xml') or die('<b>Could not load monsters!</b>');
    foreach($monsters->monster as $monster) {
        $loot = simplexml_load_file($otdir . '/data/monster/' . $monster['file']);
        if($loot) {
            if($item = $loot->loot->item) {
                echo '
                    <a id="' . ++$i . '" style="text-decoration: none; font: bold 14px verdana; color: orange;" href="javascript:void(0);" onclick="toggleVisibility(this)">[+] ' . $monster['name'] . '</a>
                    <br><div style="display: none;" id="d' . $i . '"><br>';
                addLoot($item);
                echo '<br></pre></div>';
            } elseif(!isset($_GET['hideempty']))
                echo '<span style="font: bold 14px verdana; color: red;">[x] ' . $monster['name'] . '</span><br>';
        } elseif(!isset($_GET['hidefail']))
            echo '<span style="color: white;">Failed to load monster <b>' . $monster[name] . '</b> <i>(' . $monster[file] . ')</i><br>';
    }

function addLoot($loot, $level=1) {
    foreach($loot as $test) {
        $chance = $test['chance'];
        if(!$chance)
            $chance = $test['chance1'];

        printLoot($level, $test['id'], $test['countmax'], $chance);
        foreach($test as $k => $v)
            addLoot($v->item, $level + 1);
    }
}
 
function printLoot($level, $itemid, $count, $chance) {
    global $itemList, $rarity;
    
    $chance /= 1000;
    if(isset($_GET['lootrate'])) {
        global $lootRate;
        $chance *= $lootRate;
    }
    
    foreach($rarity as $lootRarity => $percent){
        if($chance >= $percent) {
            echo str_repeat("... ", $level) . '<u>' . ($count ? $count : 1) . '</u> <span style="color: #7878FF; font-weight: bold;">' . $itemList[(int)$itemid] . '</span> - <span style="color: #C45; font-weight: bold;">' . $lootRarity . '</span> (<span style="color: #FF9A9A;">' . $chance . '%</span>)<br>';
            break;
        }
    }
}
?>
<?php include 'layout/overall/footer.php'; ?>

Bump
 

Its on my todo list, the solution is probably pretty simple but I want to rewrite a portion of the code.
$loot->loot->item does not account for the inside element. So you might want to do a test to see if inside exists, and if so loop through that one to grab each item.

I plan to look into it this weekend.
 
Back
Top