void PutBallBackInPlay::Execute(GoalKeeper* keeper) { PlayerBase* receiver = NULL; Vector2D BallTarget; //test if there are players further forward on the field we might //be able to pass to. If so, make a pass. if (keeper->Team()->FindPass(keeper, receiver, BallTarget, Prm.MaxPassingForce, Prm.GoalkeeperMinPassDist)) { //make the pass keeper->Ball()->Kick(Vec2DNormalize(BallTarget - keeper->Ball()->Pos()), Prm.MaxPassingForce); //goalkeeper no longer has ball keeper->Pitch()->SetGoalKeeperHasBall(false); //let the receiving player know the ball's comin' at him Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY, keeper->ID(), receiver->ID(), Msg_ReceiveBall, &BallTarget); //go back to tending the goal keeper->GetFSM()->ChangeState(TendGoal::Instance()); return; } keeper->SetVelocity(Vector2D()); }
void ActionBase::MessageToPlayer( Object reciever, string message ) { if( reciever && reciever.IsMan() ) { PlayerBase man = reciever; if ( man.IsAlive() ) { man.MessageFriendly(message); } } }
void checkForWinners(void) { for (unsigned int i=0; i<Player_List.size(); ++i) { PlayerBase *iPlayer = Player_List[i]; if (iPlayer->finished() && !finishedPlayers[i]) { winners.push_back(Winner(i, Maze_Timer)); finishedPlayers[i] = winners.size(); if (i==(unsigned int)humanIndex) { toggleCameraButton->show = true; } } } }
void BaseRadio::DisplayTunedFrequency ( PlayerBase player ) { float tuned_freq = this.GetTunedFrequency(); string message = "The radio frequency is set to " + ftoa( tuned_freq ) + "."; player.MessageAction( message ); }
void BaseRadio::SetPreviousFrequency ( PlayerBase player ) { this.SetPrevChannel(); float tuned_freq = this.GetTunedFrequency(); string message = "I've set radio frequency to " + ftoa( tuned_freq ) + "."; player.MessageAction( message ); }
void CGameSetup::LoadPlayers(const TdfParser& file, std::set<std::string>& nameList) { numDemoPlayers = 0; // i = player index in game (no gaps), a = player index in script int i = 0; for (int a = 0; a < MAX_PLAYERS; ++a) { char section[50]; sprintf(section, "GAME\\PLAYER%i", a); string s(section); if (!file.SectionExist(s)) { continue; } PlayerBase data; // expects lines of form team=x rather than team=TEAMx // team field is relocated in RemapTeams std::map<std::string, std::string> setup = file.GetAllValues(s); for (std::map<std::string, std::string>::const_iterator it = setup.begin(); it != setup.end(); ++it) data.SetValue(it->first, it->second); // do checks for sanity if (data.name.empty()) throw content_error(str( boost::format("GameSetup: No name given for Player %i") %a )); if (nameList.find(data.name) != nameList.end()) throw content_error(str(boost::format("GameSetup: Player %i has name %s which is already taken") %a %data.name.c_str() )); nameList.insert(data.name); if (data.isFromDemo) numDemoPlayers++; playerStartingData.push_back(data); playerRemap[a] = i; ++i; } unsigned playerCount = 0; if (file.GetValue(playerCount, "GAME\\NumPlayers") && playerStartingData.size() != playerCount) { LOG_L(L_WARNING, _STPF_ " players in GameSetup script (NumPlayers says %i)", playerStartingData.size(), playerCount); } }
bool ActionOnConsciousSelfContinuousQuantity::CanDo( PlayerBase player, Object target, ItemBase item ) { if ( player && player.IsAlive() && item.GetDamage() < 1 ) //&& IsConscious && IsNotCaptured { return true; } else { return false; } }
void KickBall::Execute(FieldPlayer* player) { //calculate the dot product of the vector pointing to the ball //and the player's heading Vector2D ToBall = player->Ball()->Pos() - player->Pos(); double dot = player->Heading().Dot(Vec2DNormalize(ToBall)); //cannot kick the ball if the goalkeeper is in possession or if it is //behind the player or if there is already an assigned receiver. So just //continue chasing the ball if (player->Team()->Receiver() != NULL || player->Pitch()->GoalKeeperHasBall() || (dot < 0) ) { #ifdef PLAYER_STATE_INFO_ON debug_con << "Goaly has ball / ball behind player" << ""; #endif player->GetFSM()->ChangeState(ChaseBall::Instance()); return; } /* Attempt a shot at the goal */ //if a shot is possible, this vector will hold the position along the //opponent's goal line the player should aim for. Vector2D BallTarget; //the dot product is used to adjust the shooting force. The more //directly the ball is ahead, the more forceful the kick double power = Prm.MaxShootingForce * dot; //if it is determined that the player could score a goal from this position //OR if he should just kick the ball anyway, the player will attempt //to make the shot if (player->Team()->CanShoot(player->Ball()->Pos(), power, BallTarget) || (RandFloat() < Prm.ChancePlayerAttemptsPotShot)) { #ifdef PLAYER_STATE_INFO_ON debug_con << "Player " << player->ID() << " attempts a shot at " << BallTarget << ""; #endif //add some noise to the kick. We don't want players who are //too accurate! The amount of noise can be adjusted by altering //Prm.PlayerKickingAccuracy BallTarget = AddNoiseToKick(player->Ball()->Pos(), BallTarget); //this is the direction the ball will be kicked in Vector2D KickDirection = BallTarget - player->Ball()->Pos(); player->Ball()->Kick(KickDirection, power); //change state player->GetFSM()->ChangeState(Wait::Instance()); player->FindSupport(); return; } /* Attempt a pass to a player */ //if a receiver is found this will point to it PlayerBase* receiver = NULL; power = Prm.MaxPassingForce * dot; //test if there are any potential candidates available to receive a pass if (player->isThreatened() && player->Team()->FindPass(player, receiver, BallTarget, power, Prm.MinPassDist)) { //add some noise to the kick BallTarget = AddNoiseToKick(player->Ball()->Pos(), BallTarget); Vector2D KickDirection = BallTarget - player->Ball()->Pos(); player->Ball()->Kick(KickDirection, power); #ifdef PLAYER_STATE_INFO_ON debug_con << "Player " << player->ID() << " passes the ball with force " << power << " to player " << receiver->ID() << " Target is " << BallTarget << ""; #endif //let the receiver know a pass is coming Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY, player->ID(), receiver->ID(), Msg_ReceiveBall, &BallTarget); //the player should wait at his current position unless instruced //otherwise player->GetFSM()->ChangeState(Wait::Instance()); player->FindSupport(); return; } //cannot shoot or pass, so dribble the ball upfield else { player->FindSupport(); player->GetFSM()->ChangeState(Dribble::Instance()); } }
bool ActionBase::OnCancel( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",""); Print("On loop finished"); return true; }
void ActionBase::Cancel( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",""); Print("Canceled from input"); }
void ActionBase::OnTick( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",""); Print("loop "); }
void ActionBase::Reset( PlayerBase player ) { player.SetAnimVariableString("userAction",""); Print("Reset"); }
void ActionBase::Do( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",m_Animation); Print("Each frame do"); }
void ActionBase::Start( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",m_Animation); }
//--- DEBUG void BaseRadio::CheckStatus ( PlayerBase player ) { string message = "Status: Is broadcasting? [" + ftoa ( this.IsBroadcasting() ) + "] --- Is receiving? [" + ftoa ( this.IsReceiving() ) + "]"; player.MessageAction( message ); }
void Siege::SiegeGunDeploy(uint client, const wstring &args) { // Abort processing if this is not a "heavy lifter" uint shiparch; pub::Player::GetShipID(client, shiparch); if (set_construction_shiparch != 0 && shiparch != set_construction_shiparch) { PrintUserCmdText(client, L"ERR Need deployment ship"); return; } uint ship; pub::Player::GetShip(client, ship); if (!ship) { PrintUserCmdText(client, L"ERR Not in space"); return; } // If the ship is moving, abort the processing. Vector dir1; Vector dir2; pub::SpaceObj::GetMotion(ship, dir1, dir2); if (dir1.x>5 || dir1.y>5 || dir1.z>5) { PrintUserCmdText(client, L"ERR Ship is moving"); return; } int min = 100; int max = 5000; int randomsiegeint = min + (rand() % (int)(max - min + 1)); string randomname = "Siege Cannon AX-" + randomsiegeint; // Check for conflicting base name if (GetPlayerBase(CreateID(PlayerBase::CreateBaseNickname(randomname).c_str()))) { PrintUserCmdText(client, L"ERR Deployment error, please reiterate."); return; } // Check that the ship has the requires commodities. int hold_size; list<CARGO_INFO> cargo; HkEnumCargo((const wchar_t*)Players.GetActiveCharacterName(client), cargo, hold_size); for (map<uint, uint>::iterator i = construction_items.begin(); i != construction_items.end(); ++i) { bool material_available = false; uint good = i->first; uint quantity = i->second; for (list<CARGO_INFO>::iterator ci = cargo.begin(); ci != cargo.end(); ++ci) { if (ci->iArchID == good && ci->iCount >= (int)quantity) { material_available = true; pub::Player::RemoveCargo(client, ci->iID, quantity); } } if (material_available == false) { PrintUserCmdText(client, L"ERR Construction failed due to insufficient raw material."); for (i = construction_items.begin(); i != construction_items.end(); ++i) { const GoodInfo *gi = GoodList::find_by_id(i->first); if (gi) { PrintUserCmdText(client, L"| %ux %s", i->second, HkGetWStringFromIDS(gi->iIDSName).c_str()); } } return; } } wstring charname = (const wchar_t*)Players.GetActiveCharacterName(client); AddLog("NOTICE: Base created %s by %s (%s)", randomname.c_str(), wstos(charname).c_str(), wstos(HkGetAccountID(HkGetAccountByCharname(charname))).c_str()); wstring password = L"hastesucks"; wstring basename = stows(randomname); PlayerBase *newbase = new PlayerBase(client, password, basename); player_bases[newbase->base] = newbase; newbase->basetype = "siegegun"; newbase->basesolar = "depot"; newbase->baseloadout = "depot"; newbase->defense_mode = 1; for (map<string, ARCHTYPE_STRUCT>::iterator iter = mapArchs.begin(); iter!=mapArchs.end(); iter++) { ARCHTYPE_STRUCT &thearch = iter->second; if (iter->first == newbase->basetype) { newbase->invulnerable = thearch.invulnerable; newbase->logic = thearch.logic; } } newbase->Spawn(); newbase->Save(); PrintUserCmdText(client, L"OK: Siege Cannon deployed"); PrintUserCmdText(client, L"Default administration password is %s", password.c_str()); }
bool ActionBase::OnReset( PlayerBase player, Object target, ItemBase item ) { player.SetAnimVariableString("userAction",""); Print("Reset"); }