diff --git a/code/web/app/app_achievements/_doc/Class_scheme.dia b/code/web/app/app_achievements/_doc/Class_scheme.dia
index fdcd0f32f..723783818 100644
Binary files a/code/web/app/app_achievements/_doc/Class_scheme.dia and b/code/web/app/app_achievements/_doc/Class_scheme.dia differ
diff --git a/code/web/app/app_achievements/_doc/Class_scheme.png b/code/web/app/app_achievements/_doc/Class_scheme.png
index 99886f635..f282dad0e 100644
Binary files a/code/web/app/app_achievements/_doc/Class_scheme.png and b/code/web/app/app_achievements/_doc/Class_scheme.png differ
diff --git a/code/web/app/app_achievements/_doc/ER_scheme.dia b/code/web/app/app_achievements/_doc/ER_scheme.dia
index f104fbfa8..bfac940f4 100644
Binary files a/code/web/app/app_achievements/_doc/ER_scheme.dia and b/code/web/app/app_achievements/_doc/ER_scheme.dia differ
diff --git a/code/web/app/app_achievements/_doc/devshot_003.jpg b/code/web/app/app_achievements/_doc/devshot_003.jpg
new file mode 100644
index 000000000..18d969ed8
Binary files /dev/null and b/code/web/app/app_achievements/_doc/devshot_003.jpg differ
diff --git a/code/web/app/app_achievements/_doc/devshot_004.jpg b/code/web/app/app_achievements/_doc/devshot_004.jpg
new file mode 100644
index 000000000..22557eedb
Binary files /dev/null and b/code/web/app/app_achievements/_doc/devshot_004.jpg differ
diff --git a/code/web/app/app_achievements/class/AVLTree_class.php b/code/web/app/app_achievements/class/AVLTree_class.php
new file mode 100644
index 000000000..d77283632
--- /dev/null
+++ b/code/web/app/app_achievements/class/AVLTree_class.php
@@ -0,0 +1,329 @@
+root = null;
+ $this->debug = $log;
+ }
+
+ function preorder() {
+ $this->AVLpreorder($this->root);
+ }
+
+ private function AVLpreorder($p) {
+ if($p != null) {
+ echo $p->getID().", ";
+ $this->AVLpreorder($p->getLeft());
+ $this->AVLpreorder($p->getRight());
+ }
+ }
+
+ function inorder() {
+ #echo "
inorder: ";
+ $this->AVLinorder($this->root);
+ }
+
+ private function AVLinorder($p) {
+ if($p != null) {
+ $this->AVLinorder($p->getLeft());
+ echo $p->getID().", ";
+ $this->AVLinorder($p->getRight());
+ }
+ }
+
+ function insert($node) {
+ if($this->root == null) {
+ $this->root = new AVLTreeNode($node);
+ }
+ else {
+ $this->root = $this->AVLinsert($this->root,new AVLTreeNode($node));
+ }
+ }
+
+ function remove($id) {
+ $n = $this->AVLfind($id,$this->root);
+
+ if($n != null) {
+ $this->AVLremove($this->root,$n);
+ return $n->getNode();
+ }
+ return null;
+ }
+
+ function find($id) {
+ #echo "
search!";
+ $res = $this->AVLfind($id,$this->root);
+ if($res != null) {
+ return $res->getNode();
+ }
+ return null;
+ }
+
+ private function AVLfind($id,$n) {
+ #echo "
".$id;
+ if($n != null) {
+ #echo "
searching for ".$id." compare to ".$n->getID();
+ if($n->getID() != $id) {
+ if($n->getID() > $id) {
+ $n = $this->AVLfind($id,$n->getLeft());
+ }
+ else {
+ $n = $this->AVLfind($id,$n->getRight());
+ }
+ }
+ }
+
+ return $n;
+ }
+
+ private function AVLremove($r,$n) {
+ if($n->getLeft() == null || $n->getRight() == null) {
+ $s = $n;
+ }
+ else {
+ $s = $this->Successor($n);
+ $n->setNode($r->getNode());
+ }
+
+ if($r->getLeft() != null) {
+ $p = $s->getLeft();
+ }
+ else {
+ $p = $s->getRight();
+ }
+
+ if($p != null) {
+ $p->setParent($s->getParent());
+ }
+
+ if($r->getParent() == null) {
+ $r = $p;
+ }
+ else {
+ $tmp = $s->getParent();
+ if($s == $tmp->getLeft()) {
+ $tmp->setLeft($p);
+ }
+ else {
+ $tmp->setRight($p);
+ }
+ }
+
+ return $r;
+ }
+
+ private function AVLinsert($r,$n) {
+ if($r == null) {
+ $r = $n;
+ }
+ else {
+ if($n->getID() < $r->getID()) {
+ $r->setLeft($this->AVLinsert($r->getLeft(),$n));
+
+ $r = $this->balance($r);
+ }
+ elseif($n->getID() > $r->getID()) {
+ $r->setRight($this->AVLinsert($r->getRight(),$n));
+
+ $r = $this->balance($r);
+ }
+
+ $r->setHeight(max($r->getHeightLeft(),$r->getHeightRight())+1);
+ }
+
+ return $r;
+ }
+
+ private function balance($r) {
+ if($r->bal() == -2) {
+ $lc = $r->getLeft();
+ if($lc->getHeightLeft() >= $lc->getHeightRight()) {
+ $r = $this->RotateToRight($r);
+ }
+ else {
+ $r = $this->DoubleRotateLeftRight($r);
+ }
+ }
+
+ if($r->bal() == 2) {
+ $rc = $r->getRight();
+ if($rc->getHeightRight() >= $rc->getHeightLeft()) {
+ $r = $this->RotateToLeft($r);
+ }
+ else {
+ $r = $this->DoubleRotateRightLeft($r);
+ }
+ }
+
+ return $r;
+ }
+
+ private function Successor($r) {
+ #echo "succ: ".$r->getID();
+ if($r->getRight() != null) {
+ return $this->Minimum($r->getRight());
+ }
+ else {
+ $n = $r->getParent();
+
+ while($n != null && $r == $n->getRight()) {
+ $r = $n;
+ $n = $n->getParent();
+ }
+ return $n;
+ }
+ }
+
+ private function Minimum($r) {
+ if($r == null) {
+ return null;
+ }
+
+ if($r->getLeft() == null) {
+ return $r;
+ }
+
+ $p = $r->getLeft();
+ while($p->getLeft() != null) {
+ $p = $p->getLeft();
+ }
+
+ return $p;
+ }
+
+ private function RotateToRight($r) {
+ if($this->debug) {
+ echo "rotaRight
";
+ }
+ $v = $r->getLeft();
+ $r->setLeft($v->getRight());
+ $v->setRight($r);
+
+ $r->setHeight(max($r->getHeightLeft(),$r->getHeightRight())+1);
+ $v->setHeight(max($v->getHeightLeft(),$r->getHeight())+1);
+
+ return $v;
+ }
+
+ private function DoubleRotateLeftRight($r) {
+ $r->setLeft($this->RotateToLeft($r->getLeft()));
+ return $this->RotateToRight($r);
+ }
+
+ private function RotateToLeft($r) {
+ if($this->debug) {
+ echo "rotaLeft
";
+ }
+ $v = $r->getRight();
+ $r->setRight($v->getLeft());
+ $v->setLeft($r);
+
+ $r->setHeight(max($r->getHeightLeft(),$r->getHeightRight())+1);
+ $v->setHeight(max($v->getHeightRight(),$r->getHeight())+1);
+
+ return $v;
+ }
+
+ private function DoubleRotateRightLeft($r) {
+ $r->setRight($this->RotateToRight($r->getRight()));
+ return $this->RotateToLeft($r);
+ }
+ }
+
+ class AVLTreeNode {
+ private $height;
+ private $left;
+ private $right;
+ private $node;
+ private $parent;
+
+ function AVLTreeNode($node) {
+ $this->height = 0;
+ $this->left = null;
+ $this->right = null;
+ $this->node = $node;
+ $this->parent = null;
+ }
+
+ function getParent() {
+ return $this->parent;
+ }
+
+ function setParent($p) {
+ $this->parent = $p;
+ }
+
+ function getNode() {
+ return $this->node;
+ }
+
+ function getLeft() {
+ return $this->left;
+ }
+
+ function getRight() {
+ return $this->right;
+ }
+
+ function getHeightLeft() {
+ if($this->left == null) {
+ return -1;
+ }
+ return $this->left->getHeight();
+ }
+
+ function getHeightRight() {
+ if($this->right == null) {
+ return -1;
+ }
+ return $this->right->getHeight();
+ }
+
+ function bal() {
+ $r = -1;
+ $l = -1;
+
+ if($this->right != null) {
+ $r = $this->right->getHeight();
+ }
+
+ if($this->left != null) {
+ $l = $this->left->getHeight();
+ }
+
+ return ($r-$l);
+ }
+
+ function getID() {
+ return $this->node->getID();
+ }
+
+ function getHeight() {
+ return $this->height;
+ }
+
+ function setHeight($h) {
+ $this->height = $h;
+ }
+
+ function setRight($r) {
+ $this->right = $r;
+ if($r != null) {
+ $r->setParent($this);
+ }
+ }
+
+ function setLeft($l) {
+ $this->left = $l;
+ if($l != null) {
+ $l->setParent($this);
+ }
+ }
+
+ function setNode($n) {
+ $this->node = $n;
+ }
+ }
+?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/AchAchievement_class.php b/code/web/app/app_achievements/class/AchAchievement_class.php
index 45c44ee80..7a1164e9e 100644
--- a/code/web/app/app_achievements/class/AchAchievement_class.php
+++ b/code/web/app/app_achievements/class/AchAchievement_class.php
@@ -1,6 +1,6 @@
getDone();
while($iter->hasNext()) {
- $curr = $this->findNodeIdx($iter->getNext());
+ $curr = $this->getChildByIdx($iter->getNext());
$val += $curr->getValue();
}
return $val;
}
function getValueOpen() {
- $iter = $this->getDone();
+ $iter = $this->getOpen();
if($iter->hasNext()) {
- $curr = $this->findNodeIdx($iter->getNext());
+ $curr = $this->getChildByIdx($iter->getNext());
return $curr->getValue();
}
return 0;
}
- function getTemplate($insert = array()) {
+ function fillTemplate($insert = array()) {
if($this->template == null) {
return implode(";",$insert);
}
@@ -103,9 +102,14 @@
return $tmp;
}
}
-
- function inDev() {
- return ($this->dev == 1);
+
+ function getTemplate() {
+ return $this->template;
}
+
+ function getCategory() {
+ return $this->category;
+ }
+
}
?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/AchList_abstract.php b/code/web/app/app_achievements/class/AchList_abstract.php
index 41c2040e9..819d4892a 100644
--- a/code/web/app/app_achievements/class/AchList_abstract.php
+++ b/code/web/app/app_achievements/class/AchList_abstract.php
@@ -27,13 +27,95 @@
$this->child_done[] = $this->addChild($n);
}
- function removeChild() {
- $idx = $this->getIdx($id);
- if($idx != null) {
- unset($this->child_open[$idx]);
- unset($this->child_done[$idx]);
- parent::removeIdx($idx);
+ final function setChildDone($idx) {
+ $this->addChildDone($idx);
+ $this->removeChildOpen($idx);
+ }
+
+ final function addChildDone($idx) {
+ echo "try adding done child: ".$idx;
+ if(!in_array($idx,$this->child_done)) {
+ $this->child_done[] = $idx;
+ echo " ... done
";
}
+ echo var_export($this->child_done,true);
+ }
+
+ final function removeChildDone($idx) {
+ echo "try removing done child: ".$idx;
+ #$res = array_search($idx,$this->child_done);
+ #if($res != false) {
+ # unset($this->child_done[$res]);
+ # echo " ... done
";
+ #}
+ foreach($this->child_done as $key=>$elem) {
+ if($elem == $idx) {
+ unset($this->child_done[$key]);
+ echo " ... done
";
+ break;
+ }
+ }
+ echo var_export($this->child_done,true);
+ }
+
+ final function setChildOpen($idx) {
+ $this->addChildOpen($idx);
+ $this->removeChildDone($idx);
+ }
+
+ final function addChildOpen($idx) {
+ echo "try adding open child: ".$idx;
+ if(!in_array($idx,$this->child_open)) {
+ $this->child_open[] = $idx;
+ echo " ... done
";
+ }
+ echo var_export($this->child_open,true);
+ }
+
+ final function removeChildOpen($idx) {
+ echo "try removing open child: ".$idx;
+
+ #$res = array_search($idx,$this->child_open);
+ #if($res != false) {
+ # unset($this->child_open[$res]);
+ # echo " ... done
";
+ #}
+ foreach($this->child_open as $key=>$elem) {
+ if($elem == $idx) {
+ unset($this->child_open[$key]);
+ echo " ... done
";
+ break;
+ }
+ }
+ echo var_export($this->child_open,true);
+ }
+
+ /*final function unsetOpen($idx) {
+ foreach($this->child_open as $key=>$elem) {
+ if($elem == $idx) {
+ unset($this->child_open[$key]);
+ break;
+ }
+ }
+ }
+
+ final function unsetDone($idx) {
+ foreach($this->child_done as $key=>$elem) {
+ if($elem == $idx) {
+ unset($this->child_done[$key]);
+ break;
+ }
+ }
+ }*/
+
+ #OVERRIDE Parentum::removeChild()
+ function removeChild($id) {
+ $n = parent::removeChild($id);
+ if($n != false && $n != null) {
+ unset($this->child_open[$n->getIdx()]);
+ unset($this->child_done[$n->getIdx()]);
+ }
+ return $n;
}
}
?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/AchMenu_class.php b/code/web/app/app_achievements/class/AchMenu_class.php
index cb54ce216..dba0d18a8 100644
--- a/code/web/app/app_achievements/class/AchMenu_class.php
+++ b/code/web/app/app_achievements/class/AchMenu_class.php
@@ -13,21 +13,21 @@
$this->open = $open;
// the summary page is autogenerated and has no database entry. We add it manually here.
- $tmp = array();
+ /*$tmp = array();
$tmp['ac_id'] = 0;
$tmp['ac_parent'] = null;
$tmp['acl_name'] = get_translation('ach_summary',$_USER->getLang());
$tmp['ac_image'] = "test.png";
$tmp['ac_order'] = -1;
$tmp['open'] = $open;
- $this->nodes[] = new AchMenuNode($tmp,$this);
+ $this->addChild(new AchMenuNode($tmp,$this));*/
$res = $DBc->sqlQuery("SELECT * FROM ach_category LEFT JOIN (ach_category_lang) ON (acl_lang='".$_USER->getLang()."' AND acl_category=ac_id) WHERE ac_parent IS NULL ORDER by ac_order ASC, acl_name ASC");
$sz = sizeof($res);
for($i=0;$i<$sz;$i++) {
$res[$i]['open'] = $open;
- $this->nodes[] = $this->makeChild($res[$i]);
+ $this->addChild($this->makeChild($res[$i]));
}
}
diff --git a/code/web/app/app_achievements/class/AchObjective_class.php b/code/web/app/app_achievements/class/AchObjective_class.php
index 4101fe727..90eebb865 100644
--- a/code/web/app/app_achievements/class/AchObjective_class.php
+++ b/code/web/app/app_achievements/class/AchObjective_class.php
@@ -60,6 +60,10 @@
return $this->name;
}
+ function getDisplayName() {
+ return $this->parent->fillTemplate(explode(";",$this->name));
+ }
+
function getDisplay() {
return $this->display;
}
diff --git a/code/web/app/app_achievements/class/AchPerk_class.php b/code/web/app/app_achievements/class/AchPerk_class.php
index a8c0713d2..ccd16b51a 100644
--- a/code/web/app/app_achievements/class/AchPerk_class.php
+++ b/code/web/app/app_achievements/class/AchPerk_class.php
@@ -1,12 +1,13 @@
name = $data['apl_name'];
$this->done = $data['app_date'];
$this->dev = $data['ap_dev'];
+ $this->template = $data['apl_template'];
+ $this->parent_id = $data['ap_parent'];
$res = $DBc->sqlQuery("SELECT * FROM ach_objective LEFT JOIN (ach_objective_lang) ON (aol_lang='".$_USER->getLang()."' AND aol_objective=ao_id) LEFT JOIN (ach_player_objective) ON (apo_objective=ao_id AND apo_player='".$_USER->getID()."') LEFT JOIN (ach_achievement) ON (aa_id=ao_metalink) WHERE ao_perk='".$this->id."'");
$sz = sizeof($res);
@@ -38,8 +41,12 @@
return $this->value;
}
+ function getDisplayName() {
+ return $this->parent->fillTemplate(explode(";",$this->name));
+ }
+
function getName() {
- return $this->parent->getTemplate(explode(";",$this->name));
+ return $this->name;
}
function objDrawable() {
@@ -62,8 +69,34 @@
return $this->done;
}
- function inDev() {
- return ($this->dev == 1);
+ function fillTemplate($insert = array()) {
+ if($this->template == null) {
+ return implode(";",$insert);
+ }
+ else {
+ $tmp = $this->template;
+ $match = array();
+ preg_match_all('#\[([0-9]+)\]#', $this->template, $match);
+ foreach($match[0] as $key=>$elem) {
+ $tmp = str_replace("[".$match[1][$key]."]",$insert[$key],$tmp);
+ }
+ return $tmp;
+ }
+ }
+
+ function getTemplate() {
+ return $this->template;
+ }
+
+ function getParentID() {
+ return $this->parent_id;
+ }
+
+ function setParentID($p) {
+ if($this->parent_id != null) {
+
+ }
+ $this->parent_id = $p;
}
}
?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/AchSummary_class.php b/code/web/app/app_achievements/class/AchSummary_class.php
index fbd1642a6..cc6ac89f6 100644
--- a/code/web/app/app_achievements/class/AchSummary_class.php
+++ b/code/web/app/app_achievements/class/AchSummary_class.php
@@ -17,6 +17,8 @@
for($i=0;$i<$sz;$i++) {
$this->addDone($this->makeChild($res[$i]));
}
+
+ #echo var_export($this->child_done,true);
}
protected function makeChild($a) {
@@ -31,11 +33,15 @@
$iter = $this->menu->getIterator();
while($iter->hasNext()) {
+ #echo "1";
$curr = $iter->getNext();
+
if($curr->getID() == 0 || $curr->inDev()) {
continue; // skip summary page
}
+ #echo $curr->getID().",";
+ #echo var_export($curr,true);
$res = $this->sumStats($curr);
$this->stats[] = array($curr->getName(),$res[0],$res[1]);
}
@@ -47,6 +53,10 @@
private function sumStats(&$node) {
global $DBc,$_USER;
+ #return array(0,0);
+
+ #echo ">".gettype($node)."<";
+
$done = 0;
$total = 0;
@@ -62,7 +72,7 @@
while($iter->hasNext()) {
$curr = $iter->getNext();
- $res = $this->sumStats($elem);
+ $res = $this->sumStats($curr);
$done += $res[0];
$total += $res[1];
}
diff --git a/code/web/app/app_achievements/class/InDev_trait.php b/code/web/app/app_achievements/class/InDev_trait.php
new file mode 100644
index 000000000..843389dba
--- /dev/null
+++ b/code/web/app/app_achievements/class/InDev_trait.php
@@ -0,0 +1,13 @@
+dev == 1);
+ }
+
+ function getDev() {
+ return $this->dev;
+ }
+ }
+?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/Node_trait.php b/code/web/app/app_achievements/class/Node_trait.php
index 527f6caa7..ead5edea3 100644
--- a/code/web/app/app_achievements/class/Node_trait.php
+++ b/code/web/app/app_achievements/class/Node_trait.php
@@ -1,5 +1,6 @@
id;
}
+ final function getIdx() {
+ return $this->idx;
+ }
+
final function getParent() {
return $this->parent;
}
- final protected function setID($id) {
+ final function setIdx($i) {
+ $this->idx = $i;
+ }
+
+ final function setID($id) {
$this->id = $id;
}
- final protected function setParent($p) {
+ final function setParent($p) {
$this->parent = $p;
}
}
diff --git a/code/web/app/app_achievements/class/Parentum_abstract.php b/code/web/app/app_achievements/class/Parentum_abstract.php
index 0d725b9c4..c651ff813 100644
--- a/code/web/app/app_achievements/class/Parentum_abstract.php
+++ b/code/web/app/app_achievements/class/Parentum_abstract.php
@@ -4,10 +4,21 @@
This class allows external access to the child-node list.
Use the NodeIterator to iterate through the list since
the numeric array keys might have gaps due to node removals!
+
+ Once init() has been called, an AVLTree is used to support the
+ functions removeChild() and findChild(). init() must be called
+ before adding any nodes!
---------------------------*/
protected $nodes = array();
+ protected $avl = null;
- abstract protected function makeChild($args); // overwriteable child generator; allows to define child type (eg.: admin classes that inherit base class)
+ protected function init() {
+ #echo "init()";
+ $this->nodes = array();
+ $this->avl = new AVLTree();
+ }
+
+ abstract protected function makeChild($args); // overwriteable child generator; allows to define child type (eg.: admin classes that inherit from base class)
final function getSize() {
return sizeof($this->nodes);
@@ -23,46 +34,59 @@
final function addChild($n) {
$tmp = sizeof($this->nodes);
+ $n->setIdx($tmp);
$this->nodes[] = $n;
+ if($this->avl != null) {
+ $this->avl->insert($n);
+ }
return $tmp;
}
+ #function drawTree() {
+ # $this->avl->inorder();
+ #}
+
function removeChild($id) {
- $this->removeIdx($this->getIdx($id));
- }
-
- function removeNode($n) {
- $this->removeIdx($this->findNode($n));
- }
-
- final protected function removeIdx($idx) {
- if($idx != null) {
- unset($this->nodes[$idx]);
+ if($this->isEmpty()) {
+ return null;
}
- }
- final protected function findNode($n) {
- foreach($this->nodes as $key=>$elem) {
- if($this->nodes[$key] === $n) {
- return $key;
+ if($this->avl == null) {
+ return false;
+ }
+ $n = $this->avl->remove($id);
+
+ #echo var_export($n,true);
+ if($n != null) {
+ if($n->getIdx() != null) {
+ unset($this->nodes[$n->getIdx()]);
}
+
+ return $n;
}
return null;
}
- final protected function findNodeIdx($idx) {
+ final function getChildByID($id) {
+ if($this->isEmpty()) {
+ return null;
+ }
+
+ if($this->avl == null) {
+ return false;
+ }
+
+ #$this->avl->inorder();
+
+ return $this->avl->find($id);
+ }
+
+ final function getChildByIdx($idx) {
+ if($this->isEmpty()) {
+ return null;
+ }
return $this->nodes[$idx];
}
-
- final protected function getIdx($id) {
- foreach($this->nodes as $key=>$elem) {
- if($elem->getID() == $id) {
- return $key;
- }
- }
-
- return null;
- }
}
?>
\ No newline at end of file
diff --git a/code/web/app/app_achievements/class/RyzomUser_class.php b/code/web/app/app_achievements/class/RyzomUser_class.php
index 2b0d6b972..9383d5aaf 100644
--- a/code/web/app/app_achievements/class/RyzomUser_class.php
+++ b/code/web/app/app_achievements/class/RyzomUser_class.php
@@ -7,7 +7,7 @@
}
function getID() {
- return 1;
+ return $this->data["id"];
}
function getLang() {
diff --git a/code/web/app/app_achievements/include/ach_render_ig.php b/code/web/app/app_achievements/include/ach_render_ig.php
index 4b67407c1..d3b5c0b05 100644
--- a/code/web/app/app_achievements/include/ach_render_ig.php
+++ b/code/web/app/app_achievements/include/ach_render_ig.php
@@ -182,7 +182,7 @@
$iter = $cat->getDone();
while($iter->hasNext()) {
- $curr = $cat->findNodeIdx($iter->getNext());
+ $curr = $cat->getChildByIdx($iter->getNext());
#$sz = sizeof($tmp);
#for($i=0;$i<$sz;$i++) {
#echo "A";
@@ -194,14 +194,14 @@
$iter = $cat->getOpen();
while($iter->hasNext()) {
- $curr = $cat->findNodeIdx($iter->getNext());
+ $curr = $cat->getChildByIdx($iter->getNext());
#$sz = sizeof($tmp);
#for($i=0;$i<$sz;$i++) {
#echo "B";
if($curr->inDev()) {
continue;
}
- $html .= ach_render_achievement_open($curr));
+ $html .= ach_render_achievement_open($curr);
}
return $html;
@@ -259,7 +259,7 @@
$html = "";
$perk_list = $ach->getOpen();
- $perk = $ach->findNodeIdx($perk_list->getNext());
+ $perk = $ach->getChildByIdx($perk_list->getNext());
if($perk->inDev()) {
return $html;
@@ -269,7 +269,7 @@
$html .= "