| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- // Forward the public function used as a timer to load/unload your vehicle
- forward Pilot_Plane_LoadUnload(playerid);
- // This function is called when a pilot wants to start a job by entering "/work"
- Pilot_StartRandomJob(playerid)
- {
- // Setup local variables
- new PilotJobSet;
- // Check the vehicle-model of the player to decide which job the player can get
- switch (GetVehicleModel(GetPlayerVehicleID(playerid)))
- {
- case VehicleShamal, VehicleNevada: // Select a random job for planes
- PilotJobSet = Pilot_Plane_SetRandomJob(playerid);
- case VehicleMaverick, VehicleCargobob: // Select a random job for helicopters
- PilotJobSet = Pilot_Heli_SetRandomJob(playerid);
- }
- // Check if a job was set correctly
- switch (PilotJobSet)
- {
- case 1, 2:
- {
- // Setup local variables
- new StartLoc[50], EndLoc[50], Load[50], RouteText[255], Float:x, Float:y, Float:z, LoadMsg[128];
- // Job has started
- APlayerData[playerid][JobStarted] = true;
- // Set jobstep to 1 (going to load the goods)
- APlayerData[playerid][JobStep] = 1;
- // Get the startlocation, endlocation and the load texts
- format(StartLoc, 50, ALocations[APlayerData[playerid][JobLoc1]][LocationName]);
- format(EndLoc, 50, ALocations[APlayerData[playerid][JobLoc2]][LocationName]);
- format(Load, 50, ALoads[APlayerData[playerid][LoadID]][LoadName]);
- // Combine it all into a string for the TextDraw (the player can see this all the time) to describe the mission
- format(RouteText, 255, TXT_TransportingFromToPickup, Load, StartLoc, EndLoc);
- // Set the TextDraw so the player can see it
- TextDrawSetString(APlayerData[playerid][MissionText], RouteText);
- // Grab the x, y, z positions for the first location
- x = ALocations[APlayerData[playerid][JobLoc1]][LocX];
- y = ALocations[APlayerData[playerid][JobLoc1]][LocY];
- z = ALocations[APlayerData[playerid][JobLoc1]][LocZ];
- // Create a checkpoint where the player should load the goods
- SetPlayerCheckpoint(playerid, x, y, z, 7);
- // Inform the player that he must load his goods
- format(LoadMsg, 128, TXT_PickupCargoAt, Load, StartLoc);
- SendClientMessage(playerid, 0xFFFFFFFF, LoadMsg);
- }
- }
- return 1;
- }
- // This function sets a random job for a plane vehicle and returns 1 if a job has been set
- // The function returns 0 if a job couldn't be set (if the player is driving an invalid vehicle to start piloting-jobs)
- Pilot_Plane_SetRandomJob(playerid)
- {
- // If the player is the driver of the vehicle (GetPlayerVehicleSeat returns -1 if the player is not in a vehicle)
- if (GetPlayerVehicleSeat(playerid) == 0)
- {
- // Check the vehicle-model of the player to decide which job the player can get
- switch (GetVehicleModel(GetPlayerVehicleID(playerid)))
- {
- case VehicleShamal, VehicleNevada:
- {
- // Get a random LoadID from the pilot-products (only the planes)
- APlayerData[playerid][LoadID] = Product_GetRandom(PCV_PilotPlane);
- // Also get a random start-location and end-location
- APlayerData[playerid][JobLoc1] = Product_GetRandomStartLoc(APlayerData[playerid][LoadID]);
- APlayerData[playerid][JobLoc2] = Product_GetRandomEndLoc(APlayerData[playerid][LoadID]);
- // Make sure the destination is not closeby (pilot-locations are ALL includes in the array)
- while (Locations_CheckDistance(APlayerData[playerid][JobLoc1], APlayerData[playerid][JobLoc2], 1000.0) == 0)
- {
- // If both locations are too close together, keep searching for a random delivery-location that's further away
- APlayerData[playerid][JobLoc2] = Product_GetRandomEndLoc(APlayerData[playerid][LoadID]);
- }
- // Return 1 to indicate that a job has been set correctly
- return 1;
- }
- }
- }
- // If no job could be set correctly, return 0
- return 0;
- }
- // This function sets a random job for a helicopter vehicle and returns 2 if a job has been set
- // The function returns 0 if a job couldn't be set (if the player is driving an invalid vehicle to start piloting-jobs)
- Pilot_Heli_SetRandomJob(playerid)
- {
- // If the player is the driver of the vehicle (GetPlayerVehicleSeat returns -1 if the player is not in a vehicle)
- if (GetPlayerVehicleSeat(playerid) == 0)
- {
- // Check the vehicle-model of the player to decide which job the player can get
- switch (GetVehicleModel(GetPlayerVehicleID(playerid)))
- {
- case VehicleMaverick, VehicleCargobob:
- {
- // Get a random LoadID from the pilot-products (only the helicopters)
- APlayerData[playerid][LoadID] = Product_GetRandom(PCV_PilotHelicopter);
- // Also get a random start-location and end-location
- APlayerData[playerid][JobLoc1] = Product_GetRandomStartLoc(APlayerData[playerid][LoadID]);
- APlayerData[playerid][JobLoc2] = Product_GetRandomEndLoc(APlayerData[playerid][LoadID]);
- // Make sure the destination is not closeby (pilot-locations are ALL includes in the array)
- while (Locations_CheckDistance(APlayerData[playerid][JobLoc1], APlayerData[playerid][JobLoc2], 1000.0) == 0)
- {
- // If both locations are too close together, keep searching for a random delivery-location that's further away
- APlayerData[playerid][JobLoc2] = Product_GetRandomEndLoc(APlayerData[playerid][LoadID]);
- }
- // Return 2 to indicate that a job has been set correctly
- return 2;
- }
- }
- }
- // If no job could be set correctly, return 0
- return 0;
- }
- // This function is called when a pilot enters a checkpoint
- Pilot_OnPlayerEnterCheckpoint(playerid)
- {
- new LoadMsg[128];
- // Check the jobstep
- switch (APlayerData[playerid][JobStep])
- {
- // JobStep is 1 (pilot is loading his goods at the checkpoint)
- case 1: format(LoadMsg, 128, TXT_LoadingGoods, ALoads[APlayerData[playerid][LoadID]][LoadName]);
- // JobStep is 2 (pilot is unloading his goods at the checkpoint)
- case 2: format(LoadMsg, 128, TXT_UnloadingGoods, ALoads[APlayerData[playerid][LoadID]][LoadName]);
- }
- // Disable the player's actions (he cannot move anymore)
- TogglePlayerControllable(playerid, 0);
- // Check the vehiclemodel of the player
- new vehicleid = GetPlayerVehicleID(playerid);
- switch (GetVehicleModel(vehicleid))
- {
- case VehicleShamal, VehicleNevada: // A plane needs 5 seconds to load/unload
- {
- // Show the message to inform him what he's doing (loading/unloading)
- GameTextForPlayer(playerid, LoadMsg, 5000, 5);
- // Start a timer (Public function "LoadUnload(playerid)" gets called when the timer runs out)
- APlayerData[playerid][LoadingTimer] = SetTimerEx("Pilot_Plane_LoadUnload", 5000, false, "d" , playerid);
- }
- case VehicleMaverick, VehicleCargobob: // A helicopter only needs 3 seconds to load/unload
- {
- // Show the message to inform him what he's doing (loading/unloading)
- GameTextForPlayer(playerid, LoadMsg, 3000, 3);
- // Start a timer (Public function "LoadUnload(playerid)" gets called when the timer runs out)
- APlayerData[playerid][LoadingTimer] = SetTimerEx("Pilot_Plane_LoadUnload", 3000, false, "d" , playerid);
- // When in a helicopter, turn off the engine so the helicopter lands and doesn't drift away with the wind
- new engine,lights,alarm,doors,bonnet,boot,objective;
- GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
- SetVehicleParamsEx(vehicleid, 0, lights, alarm, doors, bonnet, boot, objective);
- }
- }
- return 1;
- }
- // After a pilot entered a checkpoint, a timer is created. This function is called when the timer runs out
- public Pilot_Plane_LoadUnload(playerid)
- {
- // Check the JobStep
- switch (APlayerData[playerid][JobStep])
- {
- case 1: // Player must load his goods
- {
- // Setup local variables
- new StartLoc[50], EndLoc[50], Load[50], RouteText[255], Float:x, Float:y, Float:z, UnloadMsg[100];
- // Set JobStep to 2 (unloading goods)
- APlayerData[playerid][JobStep] = 2;
- // Delete the loading-checkpoint
- DisablePlayerCheckpoint(playerid);
- // Get the startlocation, endlocation and the load texts
- format(StartLoc, 50, ALocations[APlayerData[playerid][JobLoc1]][LocationName]);
- format(EndLoc, 50, ALocations[APlayerData[playerid][JobLoc2]][LocationName]);
- format(Load, 50, ALoads[APlayerData[playerid][LoadID]][LoadName]);
- // Update the missiontext
- format(RouteText, 255, TXT_TransportingFromToDeliver, Load, StartLoc, EndLoc);
- // Set the TextDraw so the player can see it
- TextDrawSetString(APlayerData[playerid][MissionText], RouteText);
- // Grab the x, y, z positions for the second location (to unload the goods)
- x = ALocations[APlayerData[playerid][JobLoc2]][LocX];
- y = ALocations[APlayerData[playerid][JobLoc2]][LocY];
- z = ALocations[APlayerData[playerid][JobLoc2]][LocZ];
- // Create a checkpoint where the player should unload the goods
- SetPlayerCheckpoint(playerid, x, y, z, 7);
- // Inform the player that he must unload his goods
- format(UnloadMsg, 100, TXT_DeliverCargoTo, Load, EndLoc);
- SendClientMessage(playerid, 0xFFFFFFFF, UnloadMsg);
- }
- case 2: // Player is delivering his goods
- {
- // Setup local variables
- new StartLoc[50], EndLoc[50], Load[50], Msg1[128], Msg2[128], Name[24];
- // Get the player name
- GetPlayerName(playerid, Name, sizeof(Name));
- // Get the startlocation, endlocation and the load texts
- format(StartLoc, 50, ALocations[APlayerData[playerid][JobLoc1]][LocationName]);
- format(EndLoc, 50, ALocations[APlayerData[playerid][JobLoc2]][LocationName]);
- format(Load, 50, ALoads[APlayerData[playerid][LoadID]][LoadName]);
- // Construct the message sent to all players that this player completed a pilot mission
- format(Msg1, 128, TXT_PlayerCompletedPilotJob, Name, Load);
- format(Msg2, 128, TXT_PlayerCompletedPilotJobInfo, StartLoc, EndLoc);
- SendClientMessageToAll(0xFFFFFFFF, Msg1);
- SendClientMessageToAll(0xFFFFFFFF, Msg2);
- // Setup local variables
- new Float:x1, Float:y1, Float:x2, Float:y2, Float:Distance, Message[128], Payment;
- // Grab the x, y, z positions for the first location (to load the goods)
- x1 = ALocations[APlayerData[playerid][JobLoc1]][LocX];
- y1 = ALocations[APlayerData[playerid][JobLoc1]][LocY];
- // Grab the x, y, z positions for the second location (to unload the goods)
- x2 = ALocations[APlayerData[playerid][JobLoc2]][LocX];
- y2 = ALocations[APlayerData[playerid][JobLoc2]][LocY];
- // Calculate the distance between both points
- Distance = floatsqroot(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
- // Calculate the payment for the player
- Payment = floatround((Distance * ALoads[APlayerData[playerid][LoadID]][PayPerUnit]), floatround_floor);
- // Pay the player based on the distance between the loading-point and unloading-point
- RewardPlayer(playerid, Payment, 1);
- // Send a message to let the player know he finished his mission and got paid
- format(Message, 128, TXT_RewardJob, Payment);
- SendClientMessage(playerid, 0xFFFFFFFF, Message);
- // Increase the stats for completing a pilot job
- APlayerData[playerid][StatsPilotJobs]++;
- // Also save the data (in case the server crashes, progress would be lost)
- PlayerFile_Save(playerid);
- // End the current pilot job (clear mission-data)
- Pilot_EndJob(playerid);
- }
- }
- // Enable the player again (he can move again)
- TogglePlayerControllable(playerid, 1);
- // Start the engine again (in case the vehicle was a helicopter, where the engine was turned off by entering a checkpoint)
- new vehicleid = GetPlayerVehicleID(playerid);
- new engine,lights,alarm,doors,bonnet,boot,objective;
- GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
- SetVehicleParamsEx(vehicleid, 1, lights, alarm, doors, bonnet, boot, objective);
- return 1;
- }
- // This function is used to cleanup the current job
- Pilot_EndJob(playerid)
- {
- // Check if a job has started
- if (APlayerData[playerid][JobStarted] == true)
- {
- // Clear all data about the job from the player, so he can start a new one
- APlayerData[playerid][JobStarted] = false;
- APlayerData[playerid][JobStep] = 0;
- APlayerData[playerid][LoadID] = 0;
- APlayerData[playerid][JobLoc1] = 0;
- APlayerData[playerid][JobLoc2] = 0;
- // Delete the checkpoint
- DisablePlayerCheckpoint(playerid);
- // Reset the missiontext
- TextDrawSetString(APlayerData[playerid][MissionText], Pilot_NoJobText);
- // Kill the LoadingTimer
- KillTimer(APlayerData[playerid][LoadingTimer]);
- }
- return 1;
- }
|