XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
daphna
ur own best nemesis
offline
Опыт: 6,116
Активность:
Console Parser
Что это?
Система консоли -> аля DotA. Вводим мессагу через - (к примеру -ms) она запускает вам нужную функцию. Система достаточно гибкая так как имеет множество настроек.
Как установить?
  1. Испортируйте код к себе в карту.
  2. Настройте нужный вам символ. (В разделе globals)
  3. Добавьте в триггер с инициализацией карты функцию ExecuteFunc("InitConsole") => это запустит Console в вашей карте.
  4. Сохраните карту (все работает)
Как добавить свою функцию.
Так как система имеет множество настроек придеться расписать подробно функции.
Собственно функция по добавлению модов пока одна.
AddMode takes player Custom,string Mode,string Exec,code Func,boolean Clear,boolean Prefix,integer PrefixSize
player Custom - игрок от которого будет работать прописка. Т.е если Player(0) то только при вводе игрока красного сработает прописка. Удобно с хостами оперировать =). Кстати если значение null то работает со всеми игроками.
string Mode - строка вызываемого мода. Т.Е сообщение после знака тире. Если строка ="XOR" значит проверяет если введен "-XOR" то срабатывает прописка =).
string Exec - строка имя. Вызывает через ExecuteFunc нужную вам функцию. При этом у вас работает переменная ConsoleTempPlayer -> игрок введщий мод для Екзекутной функции.
code Func - если Exec равна null -> то следующий по значению идет данная функция. Т.Е запускаеться некое условие которое выполняеться. Функция должна возвращать boolean. Это значение может быть нулевым если не нулевое значение Exec. Если оба значения равны null то мод не запишеться.
boolean Clear - будет ли мод очищаться после запуска функции ConsoleClear. Т.Е зачем это надо. Ну к примеру некоторые модификации отключаються через пятнадцать секунд после начала карты, а некоторые работаю вечно XD. Вот тут потребуеться Clear!! Делаем очищаемые функции true и все после вызова функции XCosoleClear => функции не будут парситься.
boolean Prefix - являеться ли переменная префиксом. Если да то после переменной можно вводить некое значение. К примеру "-ap 5000". Кстати переменные с префиксом не поддерживают дополнениями за ними. Т.Е нельзя набирать значения аля -apomem. Очень юзабельно.
boolean PrefixSize - количество символов которые обрабатываються префиксом. Т.Е если значение 2 то "-ap 123456789" выделит цифры "12". НАдеюсь понятно. Юзабилити высокое. Кстати префикс перед вызовом функции записываеться в ConsoleTempPrefix переменную =).
» code

define echo(s) = BJDebugMsg(s)

globals
 constant string TOKEN_SYMBOL="-"
endglobals

globals
boolean array XClearAbleXXX
boolean array ConsoleToAll

boolean array ConsolePrefix
integer array ConsolePrefixSize

player  array ConsolePlayer
trigger array ConsoleTrigger
string  array ConsoleSetup
boolean array ConsoleSetupBool
string  array ConsoleExternal

integer ConsoleCount=0

//integer array ConsoleLast

string ConsoleTempPrefix=null
player ConsoleTempPlayer=null
endglobals

function AddMode takes player p,string s,string ex,code func,boolean clear,boolean prefix,integer prefixSize returns nothing
if s == null then
 debug call echo("|cffff0000Console Error! Mode crush. Nill value|r")
 return 
endif
if prefix then
 set ConsolePrefix[ConsoleCount]=true
if prefixSize>0 then
  set ConsolePrefixSize[ConsoleCount]=prefixSize
else
  debug call echo("|cffff0000Console Error! Unexpected prefix to " + s + "mode|r")
  return
endif
else
 set ConsolePrefix[ConsoleCount]=false
endif
if p == null then
 set ConsoleToAll[ConsoleCount]=true
else
 set ConsoleToAll[ConsoleCount]=false
 set ConsolePlayer[ConsoleCount]=p
endif
set ConsoleSetup[ConsoleCount]=s
if ex != null then
 set ConsoleExternal[ConsoleCount]=ex
 set ConsoleSetupBool[ConsoleCount]=true
else
if func != null then
  set ConsoleTrigger[ConsoleCount]=Cond2Trg(Condition(func))
  set ConsoleSetupBool[ConsoleCount]=false
else
  debug call echo("|cffff0000Core Error! Unexpected value to " + s + "mode|r")
  return
endif
endif
set XClearAbleXXX[ConsoleCount]=clear
set ConsoleCount=ConsoleCount+1
endfunction

function ConsoleParse takes nothing returns boolean
local integer p=GetPlayerId(GetTriggerPlayer())
local string s=GetEventPlayerChatString()
local integer i=1
local integer x=0
local integer lng=StringLength(s)
local string token=SubString(s,0,1)
set ConsoleTempPlayer=GetTriggerPlayer()
if token ==TOKEN_SYMBOL then
loop
  exitwhen i>lng
  set x=0
//debug call echo("Symbol Parse: "+I2S(i))
loop
   exitwhen x>ConsoleCount
   set token=SubString(s,i,i+StringLength(ConsoleSetup[x]))
//debug call echo("Сompare Parse: " + token + " : " + ConsoleSetup[x])
if token == ConsoleSetup[x] then
if ConsoleSetupBool[x] then
if ConsolePrefix[x] and i<2 then
      set ConsoleTempPrefix=SubString(s,i+StringLength(ConsoleSetup[x])+1,i+StringLength(ConsoleSetup[x])+Cons​olePrefixSize[x]+1)
if ConsoleToAll[x] then
       call ExecuteFunc(ConsoleExternal[x])
elseif GetTriggerPlayer() == ConsolePlayer[x] then
       call ExecuteFunc(ConsoleExternal[x])
endif
//debug call echo("return execute")
      return false
else
if ConsoleToAll[x] then
       call ExecuteFunc(ConsoleExternal[x])
elseif GetTriggerPlayer() == ConsolePlayer[x] then
       call ExecuteFunc(ConsoleExternal[x])
endif
endif
else
if ConsolePrefix[x] and i<2 then
      set ConsoleTempPrefix=SubString(s,i+StringLength(ConsoleSetup[x]),i+StringLength(ConsoleSetup[x])+Consol​ePrefixSize[x])
if ConsoleToAll[x] then
       call TriggerEvaluate(ConsoleTrigger[x])
elseif GetTriggerPlayer() == ConsolePlayer[x] then
       call TriggerEvaluate(ConsoleTrigger[x])
endif
//debug call echo("return evaluate")
      return false
else
if ConsoleToAll[x] then
       call TriggerEvaluate(ConsoleTrigger[x])
elseif GetTriggerPlayer() == ConsolePlayer[x] then
       call TriggerEvaluate(ConsoleTrigger[x])
endif
endif
endif
    set i=i+StringLength(ConsoleSetup[x])-1
    exitwhen true
endif
   set x=x+1
endloop 
  set i=i+1
endloop
endif
//debug call echo("return stand")
return false
endfunction

function ConsoleClearOnce takes integer x returns nothing
set ConsoleSetup[x]="q!~#!!!#;"
set ConsoleExternal[x]=null
call TriggerClearConditions(ConsoleTrigger[x])
set ConsoleSetupBool[x]=false
set ConsoleTrigger[x]=null
set ConsolePlayer[x]=null
endfunction

function ConsoleClear takes nothing returns nothing
local integer x=0
loop
 exitwhen x>ConsoleCount
 if XClearAbleXXX[x] then
  set ConsoleSetup[x]="q!~#!!!#;"
  set ConsoleExternal[x]=null
  call TriggerClearConditions(ConsoleTrigger[x])
  set ConsoleSetupBool[x]=false
  set ConsoleTrigger[x]=null
  set ConsolePlayer[x]=null
  set ConsoleToAll[x]=false
 endif
 set x=x+1
endloop
endfunction

function InitConsole takes nothing returns nothing
local integer i=0
local trigger t=CreateTrigger()
loop
 exitwhen i>11
 call TriggerRegisterPlayerChatEvent(t,Player(i),"",true)
 set i=i+1
endloop
call TriggerAddCondition(t,Condition(function ConsoleParse))
endfunction
Версия 1.1
  • Система полностью переписана с использование struct`ур и cJass
В данной версии очень много изменений. В основном в запуске функций и записи модов.
Теперь чтобы записать мод вам придеться создавать отдельную структуру(дочернюю).
Собственно объяснять долго, попробую изложить на примере.
» Версия 1.1 (код примера)
 unit array tempUnit

 struct MS extends console

    boolean clear = false  // Данное значение указывать не обязательно указывать если оно равно false.
                           // В принчипе оно очищает функцию если она равна true, при запуске функции
                           // xconsole.clear()
                           
    boolean after = false  // Данная переменная работает если прошлый указатель равен true.
                           // Также необязательно указывать если значение равно false
                           // Очищает мод после ввода сразу.
                           
    boolean prefix = false // Использует ли функция префиксы. Удобные для записи в таком виде
                           // "-ms 50000000"
                           
    player player  = null  // Необязательно указывать если значение null. собственно работает
                           // По принципу если не указан игрок то работает для всех игроков
                           
    string curMode = "ms"  // Единственное значение которое указывать обязательно!!!
                           // Если его не указать то мод просто не запишеться,
                           // указывать надо то что пишеться после значка "-" (TOKEN_SYMBOL)
    
    method onParse takes player p returns boolean
     // данный метод запускаеться если значение boolean prefix == false.
     // собственно тут мы записываем нужный нам триггер, или по иному действия
     // выполняемые модом.
    
     echo("Current movement speed" + I2S(GetUnitMoveSpeed(tempUnit[GetPlayerId(p)])) + "!")
     return true
    endmethod
    
    //method onParsePrefix takes player p,string s returns boolean
     // Если boolean prefix == true значит запускаеться данная функция.
     // Кстати string s => наш префикс
     // тут вам будет удобно оперировать с вводимыми модификациями с префиксами.
     // А также данную функцию хорошо использовать когда вы нехотите чтобы ваша модификация 
     // как бы склеивалась с другими модификациями. (-apomem склеянная модификация из
     // ap ; om ; em)
    //endmethod
    
 endstruct
Теперь чтобы инициализировать наш мод. Я занесу в мою функцию инициализации карты такую функцию
 call xconsole.addMode(MS.create()) 
Все. Наш мод записан.
Теперь дам рабочий примера! Которые показывают основной принцип работы системы.
» Код (рабочий пример)

scope TEMPLATE initializer Init

struct MS extends console
   string curMode = "ms"
   method onParse takes player p returns boolean
    echo("That's sample test MS")
    return true
   endmethod
endstruct

struct AP extends console
   string curMode = "ap"
   boolean prefix = true
   method onParsePrefix takes player p,string s returns boolean
    echo("That's sample test AP : " + s)
    return true
   endmethod
endstruct

public function Init takes nothing returns nothing
 call xconsole.Init()                 // Функция запуска системы! Обязательна нужна
 call xconsole.addMode(MS.create())   // Функция добавляющая MS прописку в парсер
 call xconsole.addMode(AP.create())   // Функция добавляющая AP прописку в парсер
                                      // Кстати хочу заметить что порядок парсера зависит от порядка
                                      // записи функций.
endfunction

endscope
» System v1.1 (код)
library ConsoleParser{

define private TOKEN_SYMBOL = "-"

define echo(string) = DisplayTextToPlayer(GetLocalPlayer(),0,0,string)

interface console{

   boolean clear   = false
    boolean after  = false
   boolean prefix  = false

   player  player  = null
   string  curMode = null
   
   method onParse       takes player p          returns boolean defaults false
   method onParsePrefix takes player p,string s returns boolean defaults false

}

struct xconsole{

 static integer count = 0
 //console lox          = 0

 static nothing addMode(console x){
  if x.curMode == null{
   debug echo("|cffff0000Core Error! "+I2S(x)+" console curMode == null.|r")
   return
  }
  thistype.count=x
 }
 
 static nothing removeMode(console x){
  if x.curMode!="not avaible!"{
   x.curMode = "not avaible!"
   x.clear=false
  }else{
   debug echo("|cffff0000Core Error! "+I2S(x)+" console curMode double removing.|r")
  }
 }
 
 static nothing clearMode(){
  integer i=0
  console c=0
  whilenot(i>thistype.count){
   c=i
   if c.clear{
    thistype.removeMode(c)
   }
   i++
  }
 }

 static boolean parser(){
  integer p     = GetPlayerId(GetTriggerPlayer())
  string  s     = GetEventPlayerChatString()
  integer i     = 1
  integer x     = 0
  integer lng   = StringLength(s)
  string  token = SubString(s,0,1)
  console c     = 0
  if token != TOKEN_SYMBOL{
   return false
  }
  whilenot(i>lng){
   x=0
   whilenot(x>thistype.count){
    c = x
    token=SubString(s,i,i+StringLength(c.curMode))
    if token == c.curMode{
     if c.prefix{
      if c.player==null{
       c.onParsePrefix(GetTriggerPlayer(),SubString(s,i+StringLength(c.curMode)+1,lng))
       if c.clear && c.after{
        thistype.removeMode(c)
       }
      }elseif c.player==GetTriggerPlayer(){
       c.onParsePrefix(GetTriggerPlayer(),SubString(s,i+StringLength(c.curMode)+1,lng))
       if c.clear && c.after{
        thistype.removeMode(c)
       }
      }
     }else{
      if c.player==null{
       c.onParse(GetTriggerPlayer())
       if c.clear && c.after{
        thistype.removeMode(c)
       }
      }elseif c.player==GetTriggerPlayer(){
       c.onParse(GetTriggerPlayer())
       if c.clear && c.after{
        thistype.removeMode(c)
       }
      }
      i+=StringLength(c.curMode)-1
      exitwhen true
     }
    }
    x++
   }
   i++
  }
  return true
 }
 
 static nothing Init(){
  integer i=0
  trigger t=CreateTrigger()
  whilenot(i>11){TriggerRegisterPlayerChatEvent(t,Player(i++),"",true)}
  TriggerAddCondition(t,Condition(function thistype.parser))
 }
 
}

}
Прикрепленные файлы
Тип файла: w3x Console Parser v1.1 by daphna.w3x (17.6 Кбайт, 23 просмотров )
Тип файла: w3x Console Parser v1.2 by daphna.w3x (21.4 Кбайт, 22 просмотров )

Отредактировано daphna, 12.12.2009 в 09:19.
Старый 08.12.2009, 13:25
SwuJe
aka Sakh_badboy
offline
Опыт: 15,238
Активность:
Я не понял суть объясни пожалуйста.
Старый 08.12.2009, 13:30
XOR

offline
Опыт: 38,159
Активность:
Смысла не понял абсолютно.Код какая то смесь обычного жасса и сжасса.. Зачем вот делать globals? Вместо then надо { и т.д.
XiMiKs добавил:
И засунь код под
» кат
...
Читай)
а если честно, радует, что девушка пишет такое)
Старый 08.12.2009, 13:36
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
XiMiKs, я не знаю что такое cJass, но с тобой согласен!
Скажу что можно все сделать в 2-3 функции, достаточно добавить кучу ифов. И система ваще ненужна. Её сделает любой ламер даже на GUI, так что ...
Старый 08.12.2009, 13:38
daphna
ur own best nemesis
offline
Опыт: 6,116
Активность:
XiMiKs, cjass код в итоге все равно в это трансформируеться. Плюс сстема делалась как можно более гибкая в использовании. И из cjass'a лишь echo функция -_-.

Пример набросаю, и если не сложно то старый кат тег.
Старый 08.12.2009, 13:44
XOR

offline
Опыт: 38,159
Активность:
daphna , выложи пример, а то никак не пойму, где юзать:)
XiMiKs добавил:
Знаю. но, если уж юзаешь сjass, то не наполовину. +на сjassе код читабельней
Старый 08.12.2009, 13:52
Alibek
Choops
offline
Опыт: 12,699
Активность:
daphna, нехочу обижать...но система неочень нужна...это можно сделать и самому...
Старый 08.12.2009, 13:54
daphna
ur own best nemesis
offline
Опыт: 6,116
Активность:
Alibek, делалась изначально под себя. Выложила лишь потому что это возможно кому нить может пригодиться. Как говориться не хочешь не юзай =).
Старый 08.12.2009, 14:06
SwuJe
aka Sakh_badboy
offline
Опыт: 15,238
Активность:
Правильно код под КАТ с телефона ужасно просматривать,и дай пример пожалуйста
Старый 08.12.2009, 14:12
YellowStar
poon
offline
Опыт: 15,144
Активность:
Кто писал что система фуфло не шарит. Радует поддержка не только экзекута функции , но и эвалуэйта. Седлаи еще очищение через количество вызовов ведь прописка одна отрубится через пять секунд другая через 10. Плюс включение при условии чего либо, например репик работает только когда герои выбран 0.о
Старый 08.12.2009, 17:31
XOR

offline
Опыт: 38,159
Активность:
Нараян, у меня это спокойно реализуется через одно событие и пару условий. Если ты заметил что то реально интересное, объясни.
Старый 08.12.2009, 17:37
YellowStar
poon
offline
Опыт: 15,144
Активность:
Большое юзабилити функции. Т.Е все что нужно можно в одну функцию (хотя будет лучше если сделает через стракты и интерфеисы, тогда цены не будет данной наработке...)
Старый 08.12.2009, 17:43
daphna
ur own best nemesis
offline
Опыт: 6,116
Активность:
Новая версия 1.1
  • По просьбам трудящихся на структах и полностью на cJass помимо примеров =)
Старый 10.12.2009, 12:15
YellowStar
poon
offline
Опыт: 15,144
Активность:
Эм. Круто , но добавь возможность одиночных функции, т.е у тебя нельзя вводить апмс, а мсап можно. Фиксь. Плюс возможность перезаписи мода и поддержку нескольких прописок т.е ап,алпик. 0.о. Система итак зачетная, но хотелось бы еще трушнеи :).
Старый 10.12.2009, 16:46
daphna
ur own best nemesis
offline
Опыт: 6,116
Активность:
Новая версия 1.2
Исправлены вроде бы все баги, и добавлен новый тип добавления прописки. В общем смотрим первый пост
Старый 12.12.2009, 09:18
megasniper

offline
Опыт: 3,656
Активность:
вообще не понял смысла(
а как же
Миниатюры
Кликните на картинку для увеличения
Название:  image.JPG
Просмотров: 49
Размер:  15.0 Кбайт  
Старый 19.12.2009, 13:49
YellowStar
poon
offline
Опыт: 15,144
Активность:
Представь сколько тебе придется таким методом создавать проверок и дополнении? Тут же в пять деиствии ты добавишь и настроишь систему как тебе угодно, останется лишь деиствие прописки сделать.
Старый 19.12.2009, 17:09
ScorpioT1000
Работаем
offline
Опыт: отключен
Неблагодарное это дело :)
Во-первых, слишком "узкое" назначение. Система такого плана должна быть ну очень мощной, чтобы ее можно было выкладывать в паб.
Во-вторых, автор имеет плохое понятие строк в варкрафте. Алгоритмы хороши, но в варике они сакс) здесь чем больше изначально забьешь и чем меньше "затрат" на разбивку строки, тем лучше. тут это не учитывается. тот же значек "-". мелочь, а вару неприятно :)
В-третьих, оформи лучше первый пост, все перемешано и нифига толком не читаемо.
Старый 19.12.2009, 17:33
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 06:39.