ErikSon_

Feuerwerksystem by ErikSon

Aug 1st, 2014
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.82 KB | None | 0 0
  1. /*                              Feuerwerksystem by ErikSon                                                  */
  2.  
  3. #include <a_samp>
  4. #include <ocmd>
  5. #include <mapandreas>
  6.  
  7. /*  Settings    */
  8. #undef MAX_PLAYERS
  9. #define MAX_PLAYERS         5       //Spielerslot-Anzahl angeben!
  10. #define FW_RaketenPreis     50      //Preis pro Rakete
  11. #define FW_BollerPreis      20      //Preis pro Böller
  12. /*  Settings    */
  13.  
  14. enum{
  15.     FW_dShop = 2000,
  16.     FW_dShop_Rakete,
  17.     FW_dShop_Boller,
  18.     FW_dInv,
  19.     FW_dInv_Rakete,
  20.     FW_dInv_Boller,
  21.     FW_dAuswahl
  22. }
  23.  
  24. enum FW_p{
  25.     Name[MAX_PLAYER_NAME],
  26.     Raketen,
  27.     Boller,
  28.     InHand      //0 = nichts ; 1 = Rakete ; 2 = Böller
  29. }
  30. new FW_Player[MAX_PLAYERS][FW_p];
  31.  
  32. new FW_fmex[128];
  33. #define FW_formatEx(%0,%1,%2)           format(%0,sizeof(%0),%1,%2)
  34. #define FW_SCM(%0,%1)                   format(FW_fmex,128,%1)  &&  SendClientMessage(playerid,-1,FW_fmex)
  35. #define MAX_BOUNCEOBJECTS 70
  36.  
  37. new FW_timer;
  38. enum ObjectInfo {
  39.     ObjectID,
  40.     bool:created,
  41.     bool:physics,
  42.     Float:gravity,
  43.     Float:bounce_factor,
  44.     Float:vx,
  45.     Float:vy,
  46.     Float:vz,
  47.     Float:radiuss,
  48.     Float:OldZ,
  49.     Multiple,
  50.     Float:friction,
  51.     FW_art,
  52.     FW_time,
  53.     FW_go
  54. }
  55. new OBJ[MAX_BOUNCEOBJECTS][ObjectInfo];
  56.  
  57.  
  58. public OnFilterScriptInit(){
  59.     print("\n--------------------------------------");
  60.     print(" Feuerwerksystem by ErikSon");
  61.     print("--------------------------------------\n");
  62.     return FW_timer = SetTimer("Bounce",30,1);
  63. }
  64.  
  65. public OnFilterScriptExit(){
  66.     for(new i = 0; i<MAX_PLAYERS; i++)RemovePlayerAttachedObject(i,0);
  67.     KillTimer(FW_timer);
  68.     for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
  69.         if(OBJ[i][created] == true) {
  70.             DestroyObject(OBJ[i][ObjectID]);
  71.         }
  72.     }
  73.     return 1;
  74. }
  75.  
  76. public OnPlayerConnect(playerid){
  77.     return FW_Player[playerid][InHand] = 0, FW_Player[playerid][Boller] = 0, FW_Player[playerid][Raketen] = 0;
  78. }
  79.  
  80. public OnPlayerDisconnect(playerid, reason){
  81.     return FW_Player[playerid][InHand] = 0, FW_Player[playerid][Boller] = 0, FW_Player[playerid][Raketen] = 0;
  82. }
  83.  
  84. public OnPlayerSpawn(playerid){
  85.     return FW_Player[playerid][InHand] = 0;
  86. }
  87.  
  88. public OnPlayerDeath(playerid, killerid, reason){
  89.     return FW_Player[playerid][InHand] = 0;
  90. }
  91.  
  92. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys){
  93.     if(newkeys & KEY_FIRE && FW_Player[playerid][InHand] != 0){
  94.         switch(FW_Player[playerid][InHand]){
  95.             case 1:{
  96.                 new Float:pX, Float:pY,Float:pZ,ID;
  97.                 GetPlayerPos(playerid,pX,pY,pZ);
  98.                 for(new i = 0; i != MAX_BOUNCEOBJECTS; i++){
  99.                     if(OBJ[i][created] == false){
  100.                         ID = i;
  101.                     }
  102.                     RemovePlayerAttachedObject(playerid,0);
  103.                     OBJ[ID][created] = true;
  104.                     FW_Player[playerid][InHand] = 0;
  105.                     FW_Player[playerid][Raketen] --;
  106.                     OBJ[ID][FW_art] = 2;
  107.                     OBJ[ID][FW_time] = 0,OBJ[ID][FW_go] = 0;
  108.                     OBJ[ID][ObjectID] = CreateObject(18644,pX+0.8,pY+0.2,pZ-0.3,0.0,0.0,0.0);
  109.                     return ApplyAnimation(playerid,"BOMBER","BOM_Plant",3.0,0,0,0,0,0);
  110.                 }  
  111.             }
  112.             case 2:{
  113.                 new Float:pX, Float:pY,Float:pZ,Float:ang,ID;
  114.                 GetPlayerFacingAngle(playerid, ang);
  115.                 GetPlayerPos(playerid,pX,pY,pZ);
  116.                 for(new i = 0; i != MAX_BOUNCEOBJECTS; i++){
  117.                     if(OBJ[i][created] == false){
  118.                         ID = i;
  119.                     }
  120.                     if(ID != -1) {
  121.                         RemovePlayerAttachedObject(playerid,0);
  122.                         OBJ[ID][ObjectID] = CreateObject(1654,pX,pY,pZ,0.0,0.0,0.0);
  123.                         OBJ[ID][vx] = floatsin(-ang, degrees) * -5.5;
  124.                         OBJ[ID][vy] = floatcos(-ang, degrees) * -5.5;
  125.                         OBJ[ID][vz] = -3.5;
  126.                         OBJ[ID][gravity] = 10.1;
  127.                         OBJ[ID][bounce_factor] = 40.49;
  128.                         OBJ[ID][radiuss] = 0.2;
  129.                         OBJ[ID][friction] =  0.001;
  130.                         OBJ[ID][Multiple] = 0;
  131.                         OBJ[ID][FW_art] = 1;
  132.                         OBJ[ID][physics] = true;
  133.                         FW_Player[playerid][InHand] = 0;
  134.                         FW_Player[playerid][Boller] --;
  135.                         OBJ[ID][created] = true;
  136.                         return ApplyAnimation(playerid,"GRENADE","WEAPON_throwu",3.0,0,0,0,0,0);
  137.                     }
  138.                 }
  139.             }
  140.         }
  141.     }
  142.     return 1;
  143. }
  144.  
  145. public OnPlayerUpdate(playerid){
  146.     if(GetPlayerWeapon(playerid) == 0 && FW_Player[playerid][InHand] != 0){
  147.         switch(FW_Player[playerid][InHand]){
  148.             case 1:return RemovePlayerAttachedObject(playerid,0),SetPlayerAttachedObject(playerid, 0, 18644, 6, 0.054999, 0.017999, 0.255000);
  149.             case 2:return RemovePlayerAttachedObject(playerid,0),SetPlayerAttachedObject(playerid, 0, 1654, 6, 0.067000, 0.000000, 0.138000,0,0,0, 0.18999995, 0.11100002, 0.81099998);
  150.         }
  151.     }
  152.     else if(GetPlayerWeapon(playerid) != 0 && FW_Player[playerid][InHand] != 0)RemovePlayerAttachedObject(playerid,0);
  153.     else if(FW_Player[playerid][InHand] == 1 && !FW_Player[playerid][Raketen] || FW_Player[playerid][InHand] == 2 && !FW_Player[playerid][Boller])RemovePlayerAttachedObject(playerid,0);
  154.     return 1;
  155. }
  156.  
  157. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){
  158.     switch(dialogid){
  159.         case FW_dAuswahl:{
  160.             if(!response)return 1;
  161.             switch(listitem){
  162.                 case 0:{
  163.                     new str[32]; FW_formatEx(str,"Raketen: '%i'\nBöller: '%i'",FW_Player[playerid][Raketen],FW_Player[playerid][Boller]);
  164.                     return ShowPlayerDialog(playerid,FW_dInv,DIALOG_STYLE_LIST,"Feuerwerk | Inventar",str,"Auswählen","Abbrechen");
  165.                 }
  166.                 case 1:{
  167.                     new str[64]; FW_formatEx(str,"Rakete: '%i$' / Stück\nBöller: '%i$' / Stück",FW_RaketenPreis,FW_BollerPreis);
  168.                     return ShowPlayerDialog(playerid,FW_dShop,DIALOG_STYLE_LIST,"Feuerwerk | Shop",str,"Auswählen","Abbrechen");
  169.                 }
  170.             }
  171.         }
  172.         case FW_dShop:{
  173.             if(!response)return 1;
  174.             switch(listitem){
  175.                 case 0:{
  176.                     new str[80]; FW_formatEx(str,"Gebe an, wie viele Raketen du kaufen möchtest:\n\nEine Rakete kostet '%i$'",FW_RaketenPreis);
  177.                     return ShowPlayerDialog(playerid,FW_dShop_Rakete,DIALOG_STYLE_INPUT,"Feuerwerks-Shop | Raketen",str,"Kaufen","Abbrechen");
  178.                 }
  179.                 case 1:{
  180.                     new str[80]; FW_formatEx(str,"Gebe an, wie viele Böller du kaufen möchtest:\n\nEin Böller kostet '%i$'",FW_BollerPreis);
  181.                     return ShowPlayerDialog(playerid,FW_dShop_Boller,DIALOG_STYLE_INPUT,"Feuerwerks-Shop | Böller",str,"Kaufen","Abbrechen");
  182.                 }
  183.             }
  184.         }
  185.         case FW_dShop_Rakete:{
  186.             if(!response)return ocmd_feuerwerk(playerid);
  187.             if(!strval(inputtext) || strval(inputtext) > 10 || strval(inputtext) + FW_Player[playerid][Raketen] >= 10)return ocmd_feuerwerk(playerid),FW_SCM(playerid,"* Du musst mindestens eine und darfst höchstens 10 Raketen bei dir haben. Du besitzt '%i' Raketen.",FW_Player[playerid][Raketen]);
  188.             else if(GetPlayerMoney(playerid) < strval(inputtext) * FW_RaketenPreis)return ocmd_feuerwerk(playerid),FW_SCM(playerid,"* Du hast nicht genug Geld dabei! Du benötigst '%i$'.",strval(inputtext) * FW_RaketenPreis);
  189.             GivePlayerMoney(playerid,-strval(inputtext) * FW_RaketenPreis);
  190.             return FW_Player[playerid][Raketen] += strval(inputtext);
  191.         }
  192.         case FW_dShop_Boller:{
  193.             if(!response)return ocmd_feuerwerk(playerid);
  194.             if(!strval(inputtext) || strval(inputtext) > 10 || strval(inputtext) + FW_Player[playerid][Boller] >= 10)return ocmd_feuerwerk(playerid),FW_SCM(playerid,"* Du musst mindestens eine und darfst höchstens 10 Böller bei dir haben. Du besitzt '%i' Böller.",FW_Player[playerid][Boller]);
  195.             else if(GetPlayerMoney(playerid) < strval(inputtext) * FW_BollerPreis)return ocmd_feuerwerk(playerid),FW_SCM(playerid,"* Du hast nicht genug Geld dabei! Du benötigst '%i$'.",strval(inputtext) * FW_BollerPreis);
  196.             GivePlayerMoney(playerid,-strval(inputtext) * FW_BollerPreis);
  197.             return FW_Player[playerid][Boller] += strval(inputtext);
  198.         }
  199.         case FW_dInv:{
  200.             if(!response)return 1;
  201.             switch(listitem){
  202.                 case 0:return ShowPlayerDialog(playerid,FW_dInv_Rakete,DIALOG_STYLE_LIST,"Feuerwerk | Inventar | Raketen","Rakete nehmen\nRaketen wegwerfen","Auswählen","Abbrechen");
  203.                 case 1:return ShowPlayerDialog(playerid,FW_dInv_Boller,DIALOG_STYLE_LIST,"Feuerwerk | Inventar | Böller","Böller nehmen\nBöller wegwerfen","Auswählen","Abbrechen");
  204.             }
  205.         }
  206.         case FW_dInv_Rakete:{
  207.             if(!response)return ocmd_feuerwerk(playerid);
  208.             if(FW_Player[playerid][Raketen] <= 0)return FW_SCM(playerid,"* Du hast keine Raketen bei dir!");
  209.             switch(listitem){
  210.                 case 0:return FW_Player[playerid][InHand] = 1, FW_SCM(playerid,"Du hast eine Rakete in die Hand genommen. Du kannst sie mit der 'Schlag-Taste' benutzen.");
  211.                 case 1:return FW_Player[playerid][InHand] = 0, FW_Player[playerid][Raketen] = 0, FW_SCM(playerid,"Du hast deine Raketen weggeworfen."),RemovePlayerAttachedObject(playerid,0);
  212.             }
  213.         }
  214.         case FW_dInv_Boller:{
  215.             if(!response)return ocmd_feuerwerk(playerid);
  216.             if(FW_Player[playerid][Boller] <= 0)return FW_SCM(playerid,"* Du hast keine Böller bei dir!");
  217.             switch(listitem){
  218.                 case 0:return FW_Player[playerid][InHand] = 2, FW_SCM(playerid,"Du hast einen Böller in die Hand genommen. Du kannst ihn mit der 'Schlag-Taste' benutzen.");
  219.                 case 1:return FW_Player[playerid][InHand] = 0, FW_Player[playerid][Boller] = 0, FW_SCM(playerid,"Du hast deine Böller weggeworfen."),RemovePlayerAttachedObject(playerid,0);
  220.             }
  221.         }
  222.     }
  223.     return 0;
  224. }
  225.  
  226. ocmd:feuerwerk(playerid){
  227.     return ShowPlayerDialog(playerid,FW_dAuswahl,DIALOG_STYLE_LIST,"Feuerwerk","Inventar\nFeuerwerks-Shop","Auswählen","Abbrechen");
  228. }
  229.  
  230. forward Bounce();
  231. public Bounce()
  232. {
  233.     for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
  234.         switch(OBJ[i][FW_art]){
  235.             case 1:{
  236.                 if(OBJ[i][created] == true && OBJ[i][physics] == true) {
  237.                     new Float:pos[3],Float:speed,Float:angle,Float:z;
  238.                     GetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
  239.                     MapAndreas_FindZ_For2DCoord(pos[0],pos[1],z);
  240.                     speed = floatsqroot(OBJ[i][vx]*OBJ[i][vx] + OBJ[i][vy]*OBJ[i][vy]);
  241.                     if (speed > OBJ[i][friction])speed -= OBJ[i][friction] * (30/1000.0);
  242.                     else speed = 0;
  243.                     angle = atan2(OBJ[i][vy], OBJ[i][vx]);
  244.                     OBJ[i][vx] = floatcos(angle, degrees) * speed;
  245.                     OBJ[i][vy] = floatsin(angle, degrees) * speed;
  246.                     OBJ[i][vz] += OBJ[i][gravity] * (30/1000.0);
  247.                     pos[0] -= OBJ[i][vx] * (30/1000.0);
  248.                     pos[1] -= OBJ[i][vy] * (30/1000.0);
  249.                     pos[2] -= OBJ[i][vz] * (30/1000.0);
  250.                     if((pos[2] - OBJ[i][radiuss]) <= z) {
  251.                         if(z > (pos[2] - OBJ[i][radiuss]) + 2)OBJ[i][vx] *= -OBJ[i][bounce_factor] * (30/1000.0),OBJ[i][vy] *= -OBJ[i][bounce_factor] * (30/1000.0);
  252.                         else pos[2] = z + OBJ[i][radiuss];
  253.                         OBJ[i][vz] *= -OBJ[i][bounce_factor] * (30/1000.0);
  254.                         if(++OBJ[i][Multiple] > 1)OBJ[i][physics] = false;
  255.                         else OBJ[i][Multiple] = 0,OBJ[i][OldZ] = z;
  256.                     }
  257.                     if(pos[2] >8)SetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
  258.                     else DestroyObject(OBJ[i][ObjectID]),CreateExplosion(pos[0],pos[1],pos[2],11,1);
  259.                 }
  260.             }
  261.             case 2:{
  262.                 if(OBJ[i][created] == true && OBJ[i][FW_go] >= 65) {
  263.                     new Float:pos[3]; GetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
  264.                     SetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]+0.4);
  265.                     OBJ[i][FW_time] ++;
  266.                     if(OBJ[i][FW_time] >= 150){
  267.                         OBJ[i][FW_time] = 0,OBJ[i][FW_go] = 0;
  268.                         DestroyObject(OBJ[i][ObjectID]);
  269.                         return CreateExplosion(pos[0],pos[1],pos[2],6,1);
  270.                     }
  271.                 }
  272.                 else if(OBJ[i][created] == true && OBJ[i][FW_go] <65)return OBJ[i][FW_go] ++;
  273.             }
  274.         }
  275.     }
  276.     return 1;
  277. }
Advertisement
Add Comment
Please, Sign In to add comment