firstrun) { return; } $bot->SendMsg('Produce units initializing...'); $bot->SendMsg(''); $bot->ReloadConfig(); $data = loadUnits($bot); $units = (array)$data->units; $flag = (int)$data->flag; // save data into DB $savedata->produce = $data->produce; $savedata->units = $units; $bot->ld->SavePlSettings('Units', $savedata); if ((int)$data->produce != 1) { return; } if ($flag < 1){ $bot->SendMsg('No units selected to produce.'); $bot->SendMsg(''); return; } $milB = array("Drydocks", "Barracks", "Hangar"); $milBcnt1 = 0; $milBcnt2 = 0; foreach ($bot->fobjects as $obj) { if (in_array(strtok($obj['itemName'], ' '), $milB)){ $milBcnt1++; if ($flag < 1) break; /* if ($obj["state"] == 9) { // still in producing unit setState($bot,$obj,'cancel'); if (isset($bot->error_msg)) { $bot->ReloadConfig(); break; } $bot->SendMsg('Cancel '.$bot->xmlsOb->GetFname($obj["itemName"]).' ID : '.$obj['id']); } */ if ($obj["state"] == 10) { // unit matured setState($bot,$obj,Null); if (isset($bot->error_msg)) { $bot->ReloadConfig(); break; } $bot->SendMsg('Clearing out '.$bot->xmlsOb->GetFname($obj["itemName"]).' ID : '.$obj['id']); sleep(0.5); } if ($obj["state"] != 9){ // let's produce foreach($units as $key => $unit) { if ($units[$key]['count'] > 0) { setState($bot,$obj,$key); if (isset($bot->error_msg)) { $bot->ReloadConfig(); break; } $bot->SendMsg('Success building '.$unit['ingamename'].' : '.$bot->xmlsOb->GetFname($obj["itemName"]). ' ID : ' . $obj['id']); $units[$key]['count']--; $flag--; $milBcnt2++; break; } } } } } $bot->SendMsg(''); $bot->SendMsg('Done building... '.$milBcnt2.' / '.$milBcnt1); } $this->AddHook('produce_units', 'Produce_Units'); // ============================================================================ function loadUnits($bot) { // load units. Added by pjhkaka $data = $bot->ld->GetPlSettings("Units"); $cdata = LoadCDATA($bot); $units = array(); $fakeunit = array('code'=>'fake', 'name'=>'fake', 'ingamename'=>'Fake Unit', 'special'=>0, 'duration'=>1, 'inventory'=>0, 'world'=>0, 'contracted'=>0, 'limit'=>0, 'cycle'=>0, 'count'=>0, 'url'=>''); $units['fake'] = $fakeunit; foreach ($bot->xmlsOb->gsXML->items->item as $obj){ if( $obj['type'] == 'Buildable' && ($obj['subtype'] == 'air' || $obj['subtype'] == 'army' || $obj['subtype'] == 'navy')) { $code = (string)$obj['code']; $tempunit['code'] = (string)$code; // $key code $tempunit['name'] = (string)$obj['name']; $tempunit['ingamename'] = (string)$bot->xmlsOb->GetFnamefromCode($code); $tempunit['special'] = (int)isSpecial($obj); $tempunit['duration'] = (int)getDuration($obj->referenceValues); // maturing duration of unit $tempunit['inventory'] = 0; // units you have in inventory $tempunit['world'] = 0; // units you have on world $tempunit['contracted'] = 0; // units you had contracted $tempunit['limit'] = 0; // limitation of units $tempunit['cycle'] = 0; // units puchased in 1 cycle $tempunit['count'] = 0; // calculated number after considering inventory, limit, cycle foreach($obj->image as $img) { // hashed image path if ($img['name'] == "icon") { $tmptxt = $img['url']; $tmptxt2 = explode('/',$tmptxt); $url = $tmptxt2[count($tmptxt2)-1]; $tempunit['url'] = (string)$cdata[$url]['hash']; break; } } $units[$code] = (array)$tempunit; } } uasort($units, "cmpduration"); // ================================================================== different with Units_class.php $tempunits = (array)$data->units; foreach ($tempunits as $key => $tempunit){ if ($units[$key]['name'] != ''){ $units[$key]['cycle'] = (int)$tempunit['cycle']; $units[$key]['limit'] = (int)$tempunit['limit']; } } foreach ($bot->inventory as $key => $item){ if( $units[$key]['name'] != '') $units[$key]['inventory'] = (int)$item; } $milB = array("Drydocks", "Barracks", "Hangar"); foreach ($bot->fobjects as $obj){ $key = (string)$bot->xmlsOb->GetItemCode($obj['itemName']); if ($units[$key]['name'] != '') $units[$key]['world']++; else if (in_array(strtok($obj['itemName'], ' '), $milB) && $units[$obj['referenceItem']]['name'] != '') $units[$obj['referenceItem']]['contracted']++; } $flag = 0; foreach($units as $key => $unit) { $limit = $unit['limit']; $cycle = $unit['cycle']; $vacant = $limit - $unit['inventory'] - $unit['world'] - $unit['contracted']; if ($cycle == 0 || ($limit > 0 && $vacant < 1)) continue; else if ($limit == 0) $units[$key]['count'] = $cycle; else $units[$key]['count'] = min($vacant, $cycle); $flag += $units[$key]['count']; // $bot->sendMsg($key.' '.$unit['ingamename'].' '.$unit['duration'].' '.$units[$key]['count']); } $data->flag = $flag; // ================================================================== end different $data->units = $units; return $data; } // ============================================================================ function LoadCDATA($bot) // load hash pic data, Added by pjhkaka { $cdata = array(); $hashes = explode("\n",$bot->xmlsOb->gsXML->assetIndex[0]); for($i=0;$irequiredDate['start'] != '') return 1; if ( $obj['buyable'] == 'false' || $obj['zpoints'] == 'true') return 2; if ( $obj->requiredQuest != '' ) return 3; return 4; } // ============================================================================== function cmpduration($a, $b){ // compare units by specialty/maturing duration, Added by pjhkaka if ($a['special'] == $b['special']) { if ($a['duration'] == $b['duration']) return 0; else return ($a['duration'] < $b['duration']) ? -1 : 1; } else return ($a['special'] < $b['special']) ? -1 : 1; } // ============================================================================== function getDuration($referenceValues){ // get unit's maturing duration, Added by pjhkaka foreach ($referenceValues->define as $key => $value){ if ( $value['name'] == "\$MaturingDuration"){ $t_dr = (string)$value['value']; $s_dr = strlen($t_dr)-1; $i_dr = substr($t_dr,0,$s_dr); switch ($t_dr[$s_dr]){ case 's': return $i_dr; case 'm': return 60 * $i_dr; case 'h': return 60 * 60 * $i_dr; case 'd': return 60 * 60 * 24 * $i_dr; } } } return 0; } // ============================================================================== function setState($bot,$obj,$itemcode) // produce locked units { unset($bot->error_msg); $amf = new AMFObject(""); $amf->_bodys[0] = new MessageBody(); $amf->_bodys[0]->_value[0] = $bot->GetAmfHeader(); $amf->_bodys[0]->targetURI = 'BaseService.dispatchBatch'; $amf->_bodys[0]->responseURI = ''; $amf->_bodys[0]->_value[2] = 0; $amf->_bodys[0]->_value[1][0]['sequence'] = $bot->GetSequense(); $amf->_bodys[0]->_value[1][0]['functionName'] = "WorldService.performAction"; $amf->_bodys[0]->_value[1][0]['params'][0] = "setState"; if ($itemcode == 'fake'){ $amf->_bodys[0]->_value[1][0]['params'][1] = array(); $amf->_bodys[0]->_value[1][0]['params'][1]['id'] = $obj['id']; $amf->_bodys[0]->_value[1][0]['params'][1]['position'] = $obj['position']; $amf->_bodys[0]->_value[1][0]['params'][1]['itemName'] = $obj['itemName']; } else if ($itemcode == 'cancel') { $amf->_bodys[0]->_value[1][0]['params'][1] = $obj; $amf->_bodys[0]->_value[1][0]['params'][2][0]['referenceItem'] = "Null"; $amf->_bodys[0]->_value[1][0]['params'][2][0]['cancel'] = "true"; } else { $amf->_bodys[0]->_value[1][0]['params'][1] = $obj; $amf->_bodys[0]->_value[1][0]['params'][2][0]['referenceItem'] = $itemcode; } $amf->_bodys[0]->_value[1][0]['params'][1]['ch'] = $bot->ch($amf->_bodys[0]->_value[1][0]['params'][1]); $amf->_bodys[0]->_value[1][0]['params'][2][0]['ch'] = $bot->ch($amf->_bodys[0]->_value[1][0]['params'][2][0]); if ($obj['state'] == 10 && $obj['referenceItem'] == '') { $bot->dooberItems += 1; sleep(2); } $serializer = new AMFSerializer(); $result = $serializer->serialize($amf); return $bot->SendRequest($result); } /* // secert function. function GetImages($bot) { //GetImages($bot); // return; $urlhead = 'http://empire.static.zgncdn.com/'; $XML = simplexml_load_file('tmp_dir\asdf.xml'); foreach($XML as $key => $value){ $key = trim($value->Key); //$bot->sendMsg($key); $url = $urlhead.$key; $tmp = explode('/',$key); $pic = $tmp[count($tmp)-1]; $tmp2 = explode('.',$pic); if ( $tmp2[1] == 'png' && file_exists('tmp_dir\\'.$pic) == false) $bot->DownloadFile($urlhead.$key, $pic); } } */ ?>