Добавлен nazarpunk,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Zinc
Тип:
Наработка
Версия Warcraft:
1.26+
Система обработки комманд чата
Скриншоты
Установка
- Скопировать триггер CustomChatEvent
Примеры
-name Смена имени игрока
//! zinc
library PlayerName requires CustomChatEvent {
string Color[]; // Цвета игроков
// Объявим функциию сообщения, чтоб не копипастить
function msg(string str){
DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
}
// Функция изменения имени
function setName(){
player p = CCE.chatPlayer; // Игрок, написавший сообщение
string color = Color[GetPlayerId(p)]; // Цвет игрока
string oldname = GetPlayerName(p); // Имя игрока, напившего сообщение
string name = CCE.chatString; // Строка сообщения
// Зпретим короткие имена
if (StringLength(name) < 2){
if (GetLocalPlayer() == p){
msg("|cffff0000Имя должно быть не короче двух знаков!");
}
return;
}
// Сменим имя игроку
SetPlayerName(p, name);
// Сообщим всем об этом
msg(color+oldname + "|r теперь зовут "+color + name+"|r");
}
function onInit(){
msg("Чтобы изменить имя напечатайте |cffffff00-name |cff909090Ваше новое имя");
// Задаём цвета для игрока
Color[0] = "|cffff0000"; // red
Color[1] = "|cff0000ff"; // blue
Color[2] = "|cff00f5ff"; // teal
Color[3] = "|cff551A8B"; // purple
Color[4] = "|cffffff00"; // yellow
Color[5] = "|cffEE9A00"; // orange
Color[6] = "|cff00CD00"; // green
Color[7] = "|cffFF69B4"; // pink
Color[8] = "|cffC0C0C0"; // gray
Color[9] = "|cffB0E2FF"; // lightblue
Color[10] = "|cff006400"; // darkgreen
Color[11] = "|cff8B4513"; // brown
CustomChatEvent
.create("name") // ловим -name
.addSynonym("имя") // ловим -имя
.addSynonym("тфьу") // не забываем тех, кто перепутал раскладку
.onSuccess(function setName) // указываем функцию, которая сработает при удачном отлове
;
}
}
//! endzinc
-zoom Установка дальности камеры
//! zinc
library Zoom requires CustomChatEvent {
real ChangeTime = 0.6; // Время смены камеры
real Default = 1650; // Стандартное расстояние
real Min = 500; // Минимальное расстояние
real Max = 4000; // Максимальное расстояние
// Объявим функциию сообщения, чтоб не копипастить
function msg(string str){
DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
}
// Функция смены камеры
function setZoom() {
real zoom = S2R(CCE.chatString);
// При неверных или отсутствующих параметрах установим значение по умолчанию
if (zoom < Min || zoom > Max){
zoom = Default;
}
// Установим камеру
if (GetLocalPlayer() == CCE.chatPlayer && zoom >= Min && zoom <= Max){
SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, zoom, 4);
msg("Дальность камеры: |cffffff00" + I2S(R2I(zoom)) + "|r");
}
}
function onInit(){
msg("Чтобы изменить имя напечатайте |cffffff00-zoom |cff909090" + I2S(R2I(Min)) + "<>" + I2S(R2I(Max)));
CustomChatEvent
.create("zoom") // ловим -zoom
.addSynonym("зум") // ловим -зум
.addSynonym("ящщь") // не забываем тех, кто перепутал раскладку
.onSuccess(function setZoom) // указываем функцию, которая сработает при удачном отлове
;
}
}
//! endzinc
-mode Выбор модов для игры
//! zinc
library Mode {
integer Current = 0; // Текущий режим игры: 0 - не выбран;
string Help[];
player HostPlayer; // Игрок, ответственный за выбор модов;
// Объявим функциию сообщения, чтоб не копипастить
function msg(string str){
DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 60, str);
}
// Показываем список всех модов
function showHelp(){
// Перебираем массив, пока в нём есть элементы.
integer i = 1;
while(true){
if (Help[i] == null){
return;
}
msg(Help[i]);
i = i+1;
}
}
// Назначаем игрока, ответственного за выбор модов
function getHost() -> player {
integer i;
for (0 <= i < bj_MAX_PLAYER_SLOTS){
if (
GetPlayerController(Player(i)) == MAP_CONTROL_USER
&&
GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING
){
if (Player(i) == GetLocalPlayer()){
msg("Чтобы посмотреть список режимов напечатайте |cffffff00-mode");
}
return Player(i);
}
}
return Player(0); // Вернм первого игрока, чтоб парсер не ругался.
}
// Устанавливаем мод
function setMode(){
if (GetLocalPlayer() != HostPlayer) {
return;
}
if (CCE.chatCommand == "mode"){
if (Current == 0){
showHelp();
} else {
msg("Текущий режим игры: " + Help[Current]);
}
return;
}
if (Current > 0){ return; }
if (CCE.chatCommand == "allpick" || CCE.chatCommand == "ap"){
// Действия для -allpick
Current = 1;
} else if (CCE.chatCommand == "allrandom" || CCE.chatCommand == "ar"){
// Действия для -allrandom
Current = 2;
} else if (CCE.chatCommand == "singledraft" || CCE.chatCommand == "sd"){
// Действия для -singledraft
Current = 3;
}
msg("Выбран режим игры: " + Help[Current]);
}
function onInit(){
// Назначаем игрока, ответственного за выбор модов
HostPlayer = getHost();
// Заполняем подсказки
Help[1] = "|cffffff00-allpick|r / |cffffff00-ap|r, игроки могут выбирать любых героев из таверн.";
Help[2] = "|cffffff00-allrandom|r / |cffffff00-ar|r, каждому игроку достается совершенно случайный герой.";
Help[3] = "|cffffff00-singledraft|r / |cffffff00-sd|r, игроку дается на выбор 3 случайных героя.";
// Настраиваем события
CustomChatEvent
.create("mode") // ловим -mode
.addSynonym("allpick") // ловим -allpick
.addSynonym("ap") // ловим -ap
.addSynonym("allrandom") // ловим -allrandom
.addSynonym("ar") // ловим -ar
.addSynonym("singledraft") // ловим -singledraft
.addSynonym("sd") // ловим -sd
.onSuccess(function setMode) // указываем функцию, которая сработает при удачном отлове
;
}
}
//! endzinc
-unit Создание юнитов
//! zinc
library Unit requires CustomChatEvent {
real X, Y; // Координаты появления юнитов
function addUnit(){
integer i;
player p;
if (CCE.chatParamCount >= 2){
i = S2I(CCE.chatParam[0]);
if (i < 1 || i >= bj_MAX_PLAYER_SLOTS){
return;
}
p = Player(i-1);
for (1 <= i < CCE.chatParamCount){
CreateUnitByName(p, CCE.chatParam[i], X, Y, GetRandomReal(0, 360));
}
}
}
function onInit(){
// Задаём координаты
X = GetRectCenterX(gg_rct_AddUnit);
Y = GetRectCenterY(gg_rct_AddUnit);
//
CustomChatEvent
.create("unit") // ловим -unit
.addSynonym("юнит") // ловим -юнит
.addSynonym("гтше") // не забываем тех, кто перепутал раскладку
.onSuccess(function addUnit) // указываем функцию, которая сработает при удачном отлове
;
}
}
//! endzinc
Техничеcкие подробности
Порядок вызова
// Создаём функцию обработчик
function addUnit(){
// Здесь доступна структура CCE
}
// Создаём экземпляр
CustomChatEvent
.create("unit") // ловим -unit
.addSynonym("юнит") // ловим -юнит
.addSynonym("гтше") // не забываем тех, кто перепутал раскладку
.onSuccess(function addUnit) // указываем функцию, которая сработает при удачном отлове
;
Описание ССE
struct CCE {
static player chatPlayer; // Игрок, вызвавший комманду
static string chatCommand = ""; // Комманда без префикса
static string chatString = ""; // Строка параметров
static string chatParam[64]; // Массив параметров разбитых по пробелу из строки
static integer chatParamCount = 0; // Колличество полученных параметров
}
Код наработки
//! zinc
library CustomChatEvent {
CustomChatEvent Struct[];
integer StructI = -1;
string Prefix = "-";
string Delimiter = " ";
function trim(string str) -> string {
integer i, len = StringLength(str);
integer s= 0, e = len;
string c;
for(0 <= i < len){
c = SubString(str, i, i+1);
if (c == " "){ s = s+1;}
else { break; }
}
for (len > i >= 0){
c = SubString(str, i, i+1);
if (c == " "){ e = e-1; }
else { break; }
}
return SubString(str, s, e);
}
public {
struct CCE {
static player chatPlayer;
static string chatCommand = "";
static string chatString = "";
static string chatParam[64];
static integer chatParamCount = 0;
}
struct CustomChatEvent {
string CommandString[1024];
integer CommandStringI = -1;
conditionfunc CommandFunc;
method addCommandString(string s){
CommandStringI = CommandStringI + 1;
CommandString[CommandStringI] = s;
}
static method create(string s) -> CustomChatEvent {
CustomChatEvent this = CustomChatEvent.allocate();
this.addCommandString(s);
StructI = StructI + 1;
Struct[StructI] = this;
return this;
}
method getInteger() -> CustomChatEvent {
return this;
}
method addSynonym(string s) -> CustomChatEvent {
this.addCommandString(s);
return this;
}
method onSuccess(code func){
this.CommandFunc = Condition(func);
}
method check(player p, string command, string param) {
boolean isFind = false;
integer i, length = StringLength(param);
trigger t;
string str, char;
for (0 <= i <= this.CommandStringI){
if (this.CommandString[i] == command){
isFind = true;
}
}
if (isFind){
CCE.chatPlayer = p;
CCE.chatCommand = command;
CCE.chatString = param;
CCE.chatParamCount = 0;
str = "";
for(0 <= i <= length){
if (i == length){ char = Delimiter; }
else { char = SubString(param, i, i+1); }
if (char == Delimiter){
if (str != ""){
CCE.chatParam[CCE.chatParamCount] = str;
CCE.chatParamCount = CCE.chatParamCount + 1;
}
str = "";
} else {
str = str + char;
}
}
t = CreateTrigger();
TriggerAddCondition(t, this.CommandFunc);
TriggerEvaluate(t);
TriggerClearConditions(t);
DestroyTrigger(t);
}
t = null;
}
}
}
function onInit(){
integer i;
trigger t = CreateTrigger();
for (0 <= i < bj_MAX_PLAYER_SLOTS){
if (
GetPlayerController(Player(i)) == MAP_CONTROL_USER
&&
GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING
) {
TriggerRegisterPlayerChatEvent(t, Player(i), Prefix, false );
}
}
TriggerAddAction(t, function (){
string input = GetEventPlayerChatString();
integer i, k, length = StringLength(input);
string char, command = "", param = "";
boolean isCommandTyped = false;
if (SubString(input, 0, 1) != Prefix) { return; }
for(0 <= i <= length){
if (i == length){ char = Prefix; }
else { char = SubString(input, i, i+1); }
if (char == Prefix){
if (command != ""){
for(0 <= k <= StructI){
Struct[k].check(GetTriggerPlayer(), command, trim(param));
}
}
isCommandTyped = true;
command = "";
param = "";
}
if (char == Delimiter){
isCommandTyped = false;
}
if (isCommandTyped) {
if (char != Prefix){
command = command + char;
}
} else {
param = param + char;
}
}
});
t = null;
}
}
//! endzinc
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован nazarpunk
Отредактирован Берги
createunit Hpal - создаст юнита это гарвкода
createitem Iaif - создаст предмет если такое есть, иначе ошибка
addability A000 - добавит способность для выбранного юнита
removeability Acid - удалит способность у выбранного юнита
Ну и доп параметры на количество юнитов, на координаты предмета, на уровень способности и т.д.
А CreateUnitByName, это сдандартная функция чтоли? никогда не раскрывал её внутренности
Отредактирован PT153
Сам я не тестировал, но как я понял, если передать в неё Footman, то создастся пехотинец, даже если у него уже другое имя.
Bergi_Bear: