/** * This is an unique obstacle in a area. We will check if here is any drops for the character... */ function view($id = null) { if (isset($id) && !empty($id)) { $AreasObstacle = $this->AreasObstacle->find('first', array('conditions' => array('AreasObstacle.id' => $id))); // Kijken of deze items geloot mogen worden... App::import('Model', 'Drop'); $Drop = new Drop(); foreach ($AreasObstacle['Item'] as $index => $item) { if (!$Drop->canLoot($this->characterInfo, $item['AreasObstaclesItem']['id'])) { unset($AreasObstacle['Item'][$index]); } } // Kijken voor questen om in te leveren App::import('Model', 'Quest'); $Quest = new Quest(); foreach ($AreasObstacle['Quest'] as $index => $quest) { if (!$Quest->canView($this->characterInfo['Character']['id'], $quest['id'], $quest['ActionsObstacle']['type'])) { unset($AreasObstacle['Quest'][$index]); } } $this->set('AreasObstacle', $AreasObstacle); } else { $this->render(false); } }
public function isAllowToOpenDrop(Drop $drop) { $collection = new ResourceCollection(array($drop->getResourceNode())); if (false === $this->get('security.authorization_checker')->isGranted('OPEN', $collection)) { throw new AccessDeniedException(); } }
/** * Get actions for a specific area * * @param int $character_id the ID of the character * @param int $area_id the ID of the current location of the character * @return array a list of available actions */ function getActions($character_id = null, $area_id = null) { if (!isset($area_id) || !isset($character_id)) { return array(); } $actions = array(); App::import('Model', 'Drop'); $Drop = new Drop(); App::import('Model', 'Quest'); $Quest = new Quest(); $this->contain(array('AreasObstacle' => array('Item', 'Quest'), 'Npc', 'AreasMob' => array('Mob'))); $areaInfo = $this->find('first', array('conditions' => array('Area.id' => $area_id))); if ($areaInfo['Area']['travel_to'] != 0) { if ($this->canMove($area_id, $areaInfo['Area']['travel_to'], $character_id)) { $areaTo = $this->find('first', array('conditions' => array('Area.id' => $areaInfo['Area']['travel_to']))); $actions[] = array('type' => 'Area', 'data' => $areaTo); } } // Doorlopen van de Obstacles, en kijken of er iets te halen valt... foreach ($areaInfo['AreasObstacle'] as $index => $obstacle) { // Looting items if (!empty($obstacle['Item'])) { foreach ($obstacle['Item'] as $item) { if ($Drop->canLoot($item['AreasObstaclesItem']['id'], $character_id, $area_id)) { $actions[] = array('type' => 'Item', 'data' => $item); } } } // Quest inleveren of ophalen if (!empty($obstacle['Quest'])) { foreach ($obstacle['Quest'] as $quest) { if ($Quest->canView($character_id, $quest['id'], $quest['ActionsObstacle']['type'])) { $actions[] = array('type' => 'Quest', 'data' => $quest); } } } } // Talking to npcs if (!empty($areaInfo['Npc'])) { foreach ($areaInfo['Npc'] as $npc) { $actions[] = array('type' => 'Npc', 'data' => $npc); } } // Killing mobs if (!empty($areaInfo['AreasMob'])) { foreach ($areaInfo['AreasMob'] as $index => $mob) { if ($this->AreasMob->canAttack($mob['id'], $character_id, $area_id)) { $actions[] = array('type' => 'Mob', 'data' => $mob); } } } return $actions; }
/** * Updates a Quest for a Character. If the Quest is completed and turned in * the Character may receive some Quest rewards. * * @param int $quest The ID of the quest * @param int $character_id The ID of the Character * @param boolean $turnIn Whenever this quest is turning in */ function update($quest_id = null, $character_id = null, $turnIn = false) { App::import('Model', 'CharactersQuest'); $CharactersQuest = new CharactersQuest(); $conditions = array(); $conditions['CharactersQuest.completed !='] = 'finished'; if (isset($quest_id)) { $conditions['CharactersQuest.quest_id'] = $quest_id; } if (isset($character_id)) { $conditions['CharactersQuest.character_id'] = $character_id; } $quests = $CharactersQuest->find('all', array('conditions' => array($conditions))); if (!empty($quests)) { // Inventory, Kill maybe needed App::import('Model', 'Inventory'); $Inventory = new Inventory(); App::import('Model', 'Kill'); $Kill = new Kill(); $charactersQuestsData = array(); $i = 0; foreach ($quests as $quest) { $charactersQuestsData[$i]['id'] = $quest['CharactersQuest']['id']; // Get the needed things (items, object, whatever) here $itemsNeeded = $this->ItemsQuest->find('list', array('conditions' => array('ItemsQuest.quest_id' => $quest['CharactersQuest']['quest_id'], 'ItemsQuest.type' => 'needed'), 'fields' => array('ItemsQuest.item_id', 'ItemsQuest.amount'))); $mobsNeeded = $this->MobsQuest->find('list', array('conditions' => array('MobsQuest.quest_id' => $quest['CharactersQuest']['quest_id']), 'fields' => array('MobsQuest.mob_id', 'MobsQuest.amount'))); $itemsRewards = $this->ItemsQuest->find('list', array('conditions' => array('ItemsQuest.quest_id' => $quest['CharactersQuest']['quest_id'], 'ItemsQuest.type' => 'reward'), 'fields' => array('ItemsQuest.item_id', 'ItemsQuest.amount'))); $statsRewards = $this->QuestsStat->find('list', array('conditions' => array('QuestsStat.quest_id' => $quest['CharactersQuest']['quest_id']), 'fields' => array('QuestsStat.stat_id', 'QuestsStat.amount'))); $completed = ''; if (empty($itemsNeeded) && empty($mobsNeeded)) { // Geen items nodig.. Omdat er op het moment niks anders is om te controleren updaten we deze quest... if ($turnIn == true && isset($character_id) && isset($quest_id)) { $charactersQuestsData[$i]['completed'] = 'finished'; } else { $charactersQuestsData[$i]['completed'] = 'yes'; } } else { $completed = 'yes'; // Default it's completed. $itemList = array(); $mobList = array(); foreach ($itemsNeeded as $item_id => $amount) { $itemList[] = $item_id; } foreach ($mobsNeeded as $mob_id => $amount) { $mobList[] = $mob_id; } // Er zijn items nodig voor deze quest.. Kijken of deze al gehaald zijn... // ItemsNeeded: item_id => aantal_needed $characterInventories = $Inventory->find('all', array('conditions' => array('Inventory.character_id' => $quest['CharactersQuest']['character_id'], 'Inventory.item_id' => $itemList), 'fields' => array('Inventory.item_id', 'COUNT(Inventory.item_id) as amount'), 'group' => array('Inventory.item_id'))); // Er zijn mobs nodig voor deze quest. Kijken of ze gekilled zijn NADAT de quest is geaccepteerd... $characterKills = $Kill->find('all', array('conditions' => array('Kill.character_id' => $quest['CharactersQuest']['character_id'], 'Kill.mob_id' => $mobList, 'Kill.type' => 'mob', 'Kill.created >=' => $quest['CharactersQuest']['created']), 'fields' => array('Kill.mob_id', 'COUNT(Kill.target_id) as amount'), 'group' => array('Kill.target_id'))); // We hebben een lijst met items wat nodig is.. // En dit wordt een lijst met wat we hebben... $itemsHave = array(); foreach ($characterInventories as $characterInventory) { $itemsHave[$characterInventory['Inventory']['item_id']] = $characterInventory[0]['amount']; } // Opslaan yes/no of de quest compleet is... foreach ($itemsNeeded as $item_id => $amount) { if (!isset($itemsHave[$item_id]) || isset($itemsHave[$item_id]) && $itemsHave[$item_id] < $itemsNeeded[$item_id]) { $completed = 'no'; } } // We hebben nu een lijst met mobs die nodig zijn, en een lijst met kills $mobsHave = array(); foreach ($characterKills as $characterKill) { $mobsHave[$characterKill['Kill']['mob_id']] = $characterKill[0]['amount']; } // Opslaan yes/no of de quest compleet is... foreach ($mobsNeeded as $mob_id => $amount) { if (!isset($mobsHave[$mob_id]) || isset($mobsHave[$mob_id]) && $mobsHave[$mob_id] < $mobsNeeded[$mob_id]) { $completed = 'no'; } } // Maybe the character is turning in the quest... if ($completed == 'yes' && $turnIn == true && isset($character_id) && isset($quest_id)) { $completed = 'finished'; } // Als de quest 'finished' is, dan moeten eventuele items uit de inventory verwijderd worden... // Dat kan hier. if ($completed == 'finished' && !empty($itemsNeeded)) { foreach ($itemsNeeded as $item_id => $amount) { for ($j = 1; $j <= $amount; $j++) { $Inventory->deleteAll(array('Inventory.character_id' => $quest['CharactersQuest']['character_id'], 'Inventory.item_id' => $item_id)); } } } $charactersQuestsData[$i]['completed'] = $completed; } // En voor het mooi, natuurlijk ook even de rewards geven... if ($completed == 'finished' && !empty($itemsRewards)) { App::import('Model', 'Drop'); $Drop = new Drop(); foreach ($itemsRewards as $item_id => $amount) { for ($j = 1; $j <= $amount; $j++) { $data = array(); // Bagid en index opvragen $bagIndex = $Drop->hasFreeSpace($quest['CharactersQuest']['character_id'], $item_id, true); $data['character_id'] = $quest['CharactersQuest']['character_id']; $data['item_id'] = $item_id; $data['index'] = $bagIndex['index']; $data['bag_id'] = $bagIndex['bag_id']; $Inventory->create(); $Inventory->save($data); } } } if ($completed == 'finished' && !empty($statsRewards)) { App::import('Model', 'CharactersStat'); $CharactersStat = new CharactersStat(); foreach ($statsRewards as $stat_id => $amount) { $statData = array(); $statData['character_id'] = $quest['CharactersQuest']['character_id']; // Kijken of deze stat al in de database bestaat $someStat = $CharactersStat->find('first', array('conditions' => array('CharactersStat.stat_id' => $stat_id, 'CharactersStat.character_id' => $quest['CharactersQuest']['character_id']))); if (!empty($someStat)) { $statData['id'] = $someStat['CharactersStat']['id']; $statData['amount'] = $someStat['CharactersStat']['amount'] + $amount; } else { $statData['amount'] = $amount; $statData['stat_id'] = $stat_id; } $CharactersStat->create(); $CharactersStat->save($statData); } } $i++; } $CharactersQuest->saveAll($charactersQuestsData); } }