Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <YSI_Coding\y_hooks>
- #define MAX_BUILDINGS 50
- #define INVALID_BUILDING_ID (-1)
- #if !defined PRESSED
- #define PRESSED(%0) \
- (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
- enum eTPInfo {
- Float:tpX,
- Float:tpY,
- Float:tpZ,
- Float:tpR,
- tpVW,
- tpInt
- }
- enum eBuildingEnterExit
- {
- BuildingEntrance,
- BuildingExit
- }
- new BuildingInfo[MAX_BUILDINGS][eBuildingEnterExit][eTPInfo];
- forward OnBuildingCreated(buildingid);
- //======================================================================
- //--->>> Functions
- //======================================================================
- stock bool:IsValidBuilding(buildingid)
- {
- if(buildingid < 0 || buildingid > MAX_BUILDINGS) return false;
- if(BuildingInfo[buildingid][BuildingEntrance][tpX] == 0.0) return false;
- return true;
- }
- stock bool:ResetBuildingInfo(buildingid)
- {
- if(buildingid < 0 || buildingid > MAX_BUILDINGS) return false;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = 0.0;
- BuildingInfo[buildingid][BuildingEntrance][tpY] = 0.0;
- BuildingInfo[buildingid][BuildingEntrance][tpZ] = 0.0;
- BuildingInfo[buildingid][BuildingEntrance][tpR] = 0.0;
- BuildingInfo[buildingid][BuildingEntrance][tpVW] = 0;
- BuildingInfo[buildingid][BuildingEntrance][tpInt] = 0;
- BuildingInfo[buildingid][BuildingExit][tpX] = 0.0;
- BuildingInfo[buildingid][BuildingExit][tpY] = 0.0;
- BuildingInfo[buildingid][BuildingExit][tpZ] = 0.0;
- BuildingInfo[buildingid][BuildingExit][tpR] = 0.0;
- BuildingInfo[buildingid][BuildingExit][tpVW] = 0;
- BuildingInfo[buildingid][BuildingExit][tpInt] = 0;
- return true;
- }
- stock GetFreeBuildingID()
- {
- for(new i = 0; i < MAX_BUILDINGS; i++)
- {
- if(BuildingInfo[i][BuildingEntrance][tpX] == 0.0) return i;
- }
- return INVALID_BUILDING_ID;
- }
- //I dont check VW and Interior, you may need to, validate that before range check.
- stock GetBuildingNearPlayer(playerid, &eBuildingEnterExit:enterexit = BuildingEntrance)
- {
- if(!IsPlayerConnected(playerid)) return INVALID_BUILDING_ID;
- for(new i = 0; i < MAX_BUILDINGS; i++)
- {
- if(IsPlayerInRangeOfPoint(playerid, 3.0, BuildingInfo[i][BuildingEntrance][tpX],
- BuildingInfo[i][BuildingEntrance][tpY],
- BuildingInfo[i][BuildingEntrance][tpZ]))
- return i;
- if(IsPlayerInRangeOfPoint(playerid, 3.0, BuildingInfo[i][BuildingExit][tpX],
- BuildingInfo[i][BuildingExit][tpY],
- BuildingInfo[i][BuildingExit][tpZ]))
- {
- enterexit = BuildingExit;
- return i;
- }
- }
- return INVALID_BUILDING_ID;
- }
- stock bool:IsPlayerNearBuilding(playerid)
- {
- if(!IsPlayerConnected(playerid)) return false;
- if(GetBuildingNearPlayer(playerid) == INVALID_BUILDING_ID) return false;
- return true;
- }
- CreateBuilding(Float:entranceX, Float:entranceY, Float:entranceZ, Float:entranceR, entranceVW = 0, entranceInterior = 0)
- {
- new buildingid = GetFreeBuildingID();
- if(buildingid == INVALID_BUILDING_ID) return INVALID_BUILDING_ID;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceX;
- BuildingInfo[buildingid][BuildingEntrance][tpY] = entranceY;
- BuildingInfo[buildingid][BuildingEntrance][tpZ] = entranceZ;
- BuildingInfo[buildingid][BuildingEntrance][tpR] = entranceR;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceVW;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceInterior;
- CallRemoteFunction("OnBuildingCreated", "d", buildingid);
- return buildingid;
- }
- stock bool:SetBuildingEntrance(buildingid, Float:entranceX, Float:entranceY, Float:entranceZ, Float:entranceR, entranceVW = 0, entranceInterior = 0)
- {
- if(!IsValidBuilding(buildingid)) return false;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceX;
- BuildingInfo[buildingid][BuildingEntrance][tpY] = entranceY;
- BuildingInfo[buildingid][BuildingEntrance][tpZ] = entranceZ;
- BuildingInfo[buildingid][BuildingEntrance][tpR] = entranceR;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceVW;
- BuildingInfo[buildingid][BuildingEntrance][tpX] = entranceInterior;
- return true;
- }
- stock bool:SetBuildingExit(buildingid, Float:exitX, Float:exitY, Float:exitZ, Float:exitR, exitVW = 0, exitInterior = 0)
- {
- if(!IsValidBuilding(buildingid)) return false;
- BuildingInfo[buildingid][BuildingExit][tpX] = exitX;
- BuildingInfo[buildingid][BuildingExit][tpY] = exitY;
- BuildingInfo[buildingid][BuildingExit][tpZ] = exitZ;
- BuildingInfo[buildingid][BuildingExit][tpR] = exitR;
- BuildingInfo[buildingid][BuildingExit][tpX] = exitVW;
- BuildingInfo[buildingid][BuildingExit][tpX] = exitInterior;
- return true;
- }
- //======================================================================
- //--->>> Hooks
- //======================================================================
- hook OnScriptInit()
- {
- for(new i = 0; i < MAX_BUILDINGS; i++)
- {
- ResetBuildingInfo(i);
- }
- IsPlayerNearBuilding(0);
- CreateBuilding(0.0,0.0,0.0,0.0,0,0);
- SetBuildingEntrance(0, 0.0,0.0,0.0,0.0,0,0);
- SetBuildingExit(0, 0.0,0.0,0.0,0.0,0,0);
- }
- hook OnScriptExit()
- {
- }
- hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- if(!PRESSED(KEY_ACTION)) return Y_HOOKS_CONTINUE_RETURN_0;
- if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT) return Y_HOOKS_CONTINUE_RETURN_0;
- new eBuildingEnterExit:enterexit, buildingid = GetBuildingNearPlayer(playerid, enterexit);
- if(buildingid == INVALID_BUILDING_ID) return Y_HOOKS_CONTINUE_RETURN_0;
- if(enterexit == BuildingEntrance) enterexit = BuildingExit;
- SetPlayerPos(playerid, BuildingInfo[buildingid][enterexit][tpX], BuildingInfo[buildingid][enterexit][tpY], BuildingInfo[buildingid][enterexit][tpZ]);
- SetPlayerFacingAngle(playerid, BuildingInfo[buildingid][enterexit][tpR]);
- SetPlayerVirtualWorld(playerid, BuildingInfo[buildingid][enterexit][tpVW]);
- SetPlayerInterior(playerid, BuildingInfo[buildingid][enterexit][tpInt]);
- return Y_HOOKS_BREAK_RETURN_1;
- }
Advertisement
Add Comment
Please, Sign In to add comment