/* コマンドスクリプトの詰め合わせ "/dive" "/sdive" "/setpos" "/re"  by ALMEIDA 0.2.1向けに少々修正を加えましたが、基本同じです。 */ #include #include #include // カラーの設定 #define COLOR_GREY 0xAFAFAFAA #define COLOR_GREEN 0x33AA33AA #define COLOR_RED 0xAA3333AA #define COLOR_YELLOW 0xFFFF00AA #define COLOR_WHITE 0xFFFFFFAA #define COLOR_BLUE 0x0000BBAA #define COLOR_LIGHTBLUE 0x33CCFFAA #define COLOR_ORANGE 0xFF9900AA // サウンドを鳴らさない場合コメントアウトしてください。 #define POS_MUSIC // コマンドの使用を他のプレイヤーにお知らせします 不必要ならコメントアウトして下さい #define FORALL_MSG // "/dive" の高さの設定 Default = 1000 #define DIVE_HEIGHT 1000 // "/sdive" の高さの制限の設定 Default MAX = 10000 MIN = 200 #define SDIVE_MUXIMUM 10000 #define SDIVE_MINIMUM 200 // グローバル変数 new Float:X, Float:Y, Float:Z; new Float:SetX[MAX_PLAYERS], Float:SetY[MAX_PLAYERS], Float:SetZ[MAX_PLAYERS], Float:Ang[MAX_PLAYERS]; public OnFilterScriptInit() { return 1; } public OnFilterScriptExit() { return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { new idx; new cmd[256]; new tmp[256]; new VehicleID; new sdive; new string[256]; #if defined FORALL_MSG new name[MAX_PLAYER_NAME]; #endif cmd = strtok(cmdtext, idx); // 通常のダイブコマンド if(strcmp(cmd, "/dive", true) == 0) { if(GetPlayerState(playerid) == PLAYER_STATE_NONE) return 1; if(IsPlayerInAnyVehicle(playerid)) { VehicleID = GetPlayerVehicleID(playerid); GetPlayerPos(playerid, X, Y, Z); SetVehiclePos(VehicleID, X, Y, Z + DIVE_HEIGHT); } else { GetPlayerPos(playerid, X, Y, Z); SetPlayerPos(playerid, X, Y, Z + DIVE_HEIGHT); } GivePlayerWeapon(playerid, WEAPON_PARACHUTE, 1); SetPlayerInterior(playerid, 0); GameTextForPlayer(playerid, "~b~SKY DIVE!", 5000, 6); #if defined FORALL_MSG GetPlayerName(playerid, name, sizeof(name)); format(string, sizeof(string), "SKYDIVE: %s は高度 %d からスカイダイビングしました。", name, DIVE_HEIGHT); SendClientMessageToAll(COLOR_LIGHTBLUE, string); #endif return 1; } // 高さを選べるダイビング機能 "/sdive" if(strcmp(cmd, "/sdive", true) == 0) { tmp = strtok(cmdtext, idx); if(GetPlayerState(playerid) == PLAYER_STATE_NONE) return 1; if(!strlen(tmp)) { format(string, sizeof(string), " 使い方: /sdive [高度] %d から %d までの間に設定してください。", SDIVE_MINIMUM, SDIVE_MUXIMUM); SendClientMessage(playerid, COLOR_WHITE, string); return 1; } sdive = strval(tmp); // 高度の設定. if(sdive > SDIVE_MUXIMUM || sdive < SDIVE_MINIMUM) { format(string, sizeof(string), " 高度が正しくありません. %d から %d までの間に設定してください。", SDIVE_MINIMUM, SDIVE_MUXIMUM); SendClientMessage(playerid, COLOR_YELLOW, string); return 1; } if(IsPlayerInAnyVehicle(playerid)) { VehicleID = GetPlayerVehicleID(playerid); GetPlayerPos(playerid, X, Y, Z); SetVehiclePos(VehicleID, X, Y, Z + sdive); } else { GetPlayerPos(playerid, X, Y, Z); SetPlayerPos(playerid, X, Y, Z + sdive); } SetPlayerInterior(playerid, 0); GivePlayerWeapon(playerid, WEAPON_PARACHUTE, 1); GameTextForPlayer(playerid, "~b~SKY DIVE!", 5000, 6); #if defined FORALL_MSG GetPlayerName(playerid, name, sizeof(name)); format(string, sizeof(string), "SKYDIVE: %s は高度 %d からスカイダイビングしました。", name, sdive); SendClientMessageToAll(COLOR_LIGHTBLUE, string); #endif return 1; } /* 簡易テレポート記憶システム M&Bさんの助言により可能になった物です。Thanks !!! */ // "/setpos" 場所を記憶させます if(strcmp(cmd, "/setpos", true) == 0) { if(IsPlayerInAnyVehicle(playerid)) { VehicleID = GetPlayerVehicleID(playerid); GetVehiclePos(VehicleID, SetX[playerid], SetY[playerid], SetZ[playerid]); GetVehicleZAngle(VehicleID, Ang[playerid]); } else { GetPlayerPos(playerid, SetX[playerid], SetY[playerid], SetZ[playerid]); GetPlayerFacingAngle(playerid, Ang[playerid]); } #if defined POS_MUSIC PlayerPlaySound(playerid, 1056, SetX[playerid], SetY[playerid], SetZ[playerid]); #endif SendClientMessage(playerid, COLOR_ORANGE, "現在地を登録しました。この地点に戻る場合 /re を入力して下さい。"); #if defined FORALL_MSG GetPlayerName(playerid, name, sizeof(name)); format(string, sizeof(string), "SETPOS: %s は %0.f %0.f %0.f %0.f度の地点を記憶しました", name, SetX[playerid], SetY[playerid], SetZ[playerid], Ang[playerid]); SendClientMessageToAll(COLOR_LIGHTBLUE, string); #endif return 1; } // "/re" 記憶した場所まで戻ります if(strcmp(cmd, "/re", true) == 0) { // これはお好みでどうぞ if(SetX[playerid] == 0.0 && SetY[playerid] == 0.0 && SetZ[playerid] == 0.0) { SendClientMessage(playerid, COLOR_WHITE, "使い方: 先に /setpos をして現在地を登録してください。"); return 1; } if(IsPlayerInAnyVehicle(playerid)) { VehicleID = GetPlayerVehicleID(playerid); SetVehiclePos(VehicleID, SetX[playerid], SetY[playerid], SetZ[playerid]); SetVehicleZAngle(VehicleID, Ang[playerid]); } else { SetPlayerPos(playerid,SetX[playerid], SetY[playerid], SetZ[playerid]); SetPlayerFacingAngle(playerid, Ang[playerid]); } SetPlayerInterior(playerid, 0); SetCameraBehindPlayer(playerid); #if defined POS_MUSIC PlayerPlaySound(playerid, 1057, SetX[playerid], SetY[playerid], SetZ[playerid]); #endif SendClientMessage(playerid, COLOR_ORANGE, "登録した地点へテレポートしました。"); #if defined FORALL_MSG GetPlayerName(playerid, name, sizeof(name)); format(string, sizeof(string), "SETPOS: %s は %0.f %0.f %0.f %0.f度の地点に戻りました。", name, SetX[playerid], SetY[playerid], SetZ[playerid], Ang[playerid]); SendClientMessageToAll(COLOR_LIGHTBLUE, string); #endif return 1; } return 0; } /* 簡易テレポート記憶システム ここまで */ // stotok lvdmodより引用 strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; }