Half-Life и Adrenaline Gamer форум
http://aghl.ru/forum/

аля скриптинг xD
http://aghl.ru/forum/viewtopic.php?f=20&t=391
Страница 1 из 6

Автор:  Turanga_Leela [ 31 май 2011, 00:09 ]
Заголовок сообщения:  аля скриптинг xD

Вот кусок кода ))
Код:
    
function_2(mode, _, _, ...)
{   
   new Float:f_int
   new pev_is
   
   switch(mode)
   {   
      case 1: pev_is = pev_health   // 41 пробывал присваивать индекс
      case 2: pev_is = pev_armorvalue   // 47
      case 3:   
      {   
         function_2(1)
         function_2(2)
      }
   }
   pev(player, pev_is, f_int) // ошибка тут
   ((f_int += f_random_int) > f_max_int) ? (f_int = f_max_int):f_int
   set_pev(player, pev_is, f_int) // ошибка тут   
}

Компилится без ошибок, добавляет хп ап
Выдает с debug: [FAKEMETA] Undefined pev index: 0

Вопрос: Как заменить значение "pev_" в зависимости от switch(mode) ...

Автор:  KORD_12.7 [ 31 май 2011, 04:37 ]
Заголовок сообщения:  Re: аля скриптинг xD

[FAKEMETA] Undefined pev index: 0 тут может возникнуть только если mode == 0 || mode > 3

Автор:  Lev [ 31 май 2011, 06:51 ]
Заголовок сообщения:  Re: аля скриптинг xD

KORD_12.7 писал(а):
[FAKEMETA] Undefined pev index: 0 тут может возникнуть только если mode == 0 || mode > 3
Тогда стоит добавить
Код:
default:

Turanga_Leela
ЗЫ Если не секрет, ты по какой книжке программировать учишься? А то код очень нестандартно выглядит. хД

Автор:  Turanga_Leela [ 31 май 2011, 11:28 ]
Заголовок сообщения:  Re: аля скриптинг xD

KORD_12.7
В примере mode = 3, это 100%, так как выполняет по намеченному case 3: - do case 1, case 2. Почему-то не присваивает переменной значение "pev_" или же это присвоение не нравится fakemet(e) :pardon:
Lev
В добавлении
Код:
default:
нет смысла, тут четко определены значения - 1 & 2 // 3 = 1, 2
Цитата:
ЗЫ Если не секрет, ты по какой книжке программировать учишься? А то код очень нестандартно выглядит. хД
Учусь на своих и чужих ошибках + полистываю сырки :wink:, если разобрать данный случай
Код:
#define function_2(%1)   func(player, Float:f_random_int, Float:f_max_int, %1, num)
function_2(1) // mode = 1   (зависит от cvar 1-3)
//сделано по аналогии - #define IsPlayer(%1)  (1 <= %1 <= g_MaxPlayers)
PS
Решил проблему так:
Код:
func(player, Float:f_random_int, Float:f_max_int, mode, num)
{
new Float:f_int
   switch(mode)
   {   
      case 1: pev(player, pev_health, f_int)
      case 2: pev(player, pev_armorvalue, f_int)
      case 3:
      {
         function_2(1)
         function_2(2)
      }
   }
   ((f_int += f_random_int) > f_max_int) ? (f_int = f_max_int):f_int

   if(mode == 1)      set_pev(player, pev_health, f_int)
   else if(mode == 2)   set_pev(player, pev_armorvalue, f_int)
}

Автор:  KORD_12.7 [ 31 май 2011, 12:37 ]
Заголовок сообщения:  Re: аля скриптинг xD

Код:
/* AMX Mod X
*   Increase Points
*
* http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
*
* This file is provided as is (no warranties)
*/

#pragma semicolon 1
#pragma ctrlchar '\'

#include <amxmodx>
#include <fun>

#define PLUGIN "Increase Points"
#define VERSION "0.1"
#define AUTHOR "KORD_12.7"

#define MAX_HEALTH 150
#define MAX_ARMOR 200

#define RND_HEALTH_MIN 1
#define RND_HEALTH_MAX 10

#define RND_ARMOR_MIN 1
#define RND_ARMOR_MAX 15

#define check_bit(%1,%2) (%1 & (1<<%2))

new g_pcvar_mode;

enum _:MODES
{
   MODE_HEALTH,
   MODE_ARMOR
}

public plugin_init()
{
   register_plugin(PLUGIN, VERSION, AUTHOR);
   register_clcmd("say /increase", "CmdIncreasePoints");

   // 1 - increase health
   // 2 - increase armor
   // 3 - increase health and armor (3 = 1 + 2)
   g_pcvar_mode = register_cvar("amx_increase_mode", "3");
}

public CmdIncreasePoints(id)
{
   new mode = get_pcvar_num(g_pcvar_mode);
   if (!mode) return;
      
   if (check_bit(mode, MODE_HEALTH))
   {
      new hp = get_user_health(id);
      set_user_health(id, ((hp += random_num(RND_HEALTH_MIN, RND_HEALTH_MAX)) > MAX_HEALTH) ? MAX_HEALTH : hp);
   }
   
   if (check_bit(mode, MODE_ARMOR))
   {
      new ap = get_user_armor(id);
      set_user_armor(id, ((ap += random_num(RND_ARMOR_MIN, RND_ARMOR_MAX)) > MAX_ARMOR) ? MAX_ARMOR : ap);
   }
}

Автор:  Turanga_Leela [ 01 июн 2011, 15:46 ]
Заголовок сообщения:  Re: аля скриптинг xD

KORD_12.7
Долго пришлось разбираться -_- с битовыми смещениями в итоге вот что получилось

1 = 0000 0001
2 = 0000 0010
3 = 0000 0011

mode(1) = 0000 0001 & 0000 0001 = 1 // MODE_HEALTH - смещение 0
mode(2) = 0000 0010 & 0000 0010 = 2 // MODE_ARMOR - смещение 1

mode(3) = 0000 0011 & 0000 0001 = 1
mode(3) = 0000 0011 & 0000 0010 = 2

Вопросик: как можно перевести на русский язык:
Код:
if (check_bit(mode, MODE_HEALTH))     // if(1) ??
if (check_bit(mode, MODE_ARMOR))      // if(2) ??

Автор:  Lev [ 01 июн 2011, 17:17 ]
Заголовок сообщения:  Re: аля скриптинг xD

Проверка на установленный бит (1 он или 0).

Автор:  Turanga_Leela [ 01 июн 2011, 17:26 ]
Заголовок сообщения:  Re: аля скриптинг xD

Lev
Насчет "1" понятно, ... т.е. выполняет при любом X > 0 ?

Автор:  Lev [ 01 июн 2011, 20:48 ]
Заголовок сообщения:  Re: аля скриптинг xD

Где там X?

Автор:  Turanga_Leela [ 01 июн 2011, 21:21 ]
Заголовок сообщения:  Re: аля скриптинг xD

Lev
X это выражение в условии
Код:
if(1) // if(X=1) отсюда вопрос X > 0 ?

Страница 1 из 6 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/