Союз | Union

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты


Скрипты

Сообщений 211 страница 240 из 345

211

Ну, написанный код тоже задает вероятность. Примерно в 1% :D (т.е. если случайное число получится строго равным 10).

Отредактировано yuritch (2011-01-17 12:21:31)

0

212

Reks написал(а):

RandomInt(100)<=10

Вероятность можно задать разными способами, кому как нравится

0

213

Jukov написал(а):

Вероятность можно задать разными способами, кому как нравится

Можно. Я лишь указал, так как ИМХО так удобнее. Сразу видишь величину в процентах, с которыми вероятность чаще всего оперирует.
Можно конечно и "по молдовански" сделать, меняя цифру в скобках. Это уже дело вкуса и профессионализма.

0

214

Вот такая функция может быть полезна картоделам, например, с ее помощью можно получить на карте мост в полу-разрушенном виде, в чем может возникнуть необходимость для антуража:
- выставляет объекту(юниту) заданное количество HPs
function SetScriptObjectsHPs (scriptid,newhp)
  local hps = GetObjectsHPs(scriptid);
  if (hps - newhp ~=0) then
  DamageObject(scriptid,hps-newhp);
  end;
end;

+2

215

rjkz 2 написал(а):

отбив окоп у врага сталкиваешся с контратакой, враг дойдя до окопа  там тупит!!! Зная сей затуп враг тупо уничтожается артой.

Для скриптоделов -какой скрипт можно использовать для посадки пехоты после движения (вражеская пехота атакует позиции и после атаки садится в отбитые траншеи) в окоп (по примеру приведенной ситуации)

0

216

alex написал(а):

какой скрипт можно использовать для посадки пехоты после движения (вражеская пехота атакует позиции и после атаки садится в отбитые траншеи) в окоп

Команда "Enter"(6).
Выглядит так:
Cmd(3,100,11250,12350); - взвод со скриптовым номером 100 следует в режиме атаки к точке x,y
QCmd(6,100,1000); - взвод со скриптовым номером 100 садится в окоп со скриптовым номером 1000.
То есть сегменту окопа куда будет садится пехота надо присвоить номер, и направлять пехоту нужно поближе к этому окопу(координаты x,y в первой строчке). То же самое и для посадки в здание.

+1

217

если давать двойную команду, то между ними возникает пауза - добежали, застыли, потом сели в окоп
Можно просто сразу направить их в окоп

0

218

Насчет паузы, - такая пауза может возникать если в скваде имеются разные виды пехоты, с разной скоростью движения(например, пулеметчик идет медленнее, чем простой солдат), а взвод будет выполнять команду посадки, когда весь сквад будет в непосредственной близости к указанной траншее. Однако, учитывая то, что все это происходит во время атаки, то эта мини-пауза получается вообще незаметной(еще не факт, что все они добегут живыми до этого окопа).
А также может возникнуть необходимость, когда пехота сначала атакует какую-то зону, а уже потом бежит(если кто остался в живых) и садится в окоп, который находится в стороне от зоны атаки. Поэтому я и указал последовательность команд. Ну это все уже на усмотрение картодела, в каждом конкретном случае.

Вот как пример использования этих команд:

function Kontra19()
  local A_Swarm = 3;
  local A_Enter = 6;
  local A_Leave = 7;
  local a = GetNUnitsInScriptGroup(691)+GetNUnitsInScriptGroup(692)+GetNUnitsInScriptGroup(693)+GetNUnitsInScriptGroup(694)+GetNUnitsInScriptGroup(695)+GetNUnitsInScriptGroup(696);
  if (a <= 3) then
   Cmd(7,742,10283,9825);
   QCmd(3,742,11215,8650);
   QCmd(6,742,1159);
   Cmd(7,743,10395,9820);
   QCmd(3,743,11365,8685);
   QCmd(6,743,1160);
   Cmd(7,744,10480,9825);
   QCmd(3,744,11955,8110);
   QCmd(6,744,1161);
   Cmd(7,745,10600,9820);
   QCmd(3,745,12080,8225);
   QCmd(6,745,1162);
   Cmd(7,745,10700,9885);
   QCmd(3,745,12095,8480);
   QCmd(6,745,1152);
   Cmd(7,746,11330,9995);
   QCmd(3,746,11860,9465);
   QCmd(3,746,12160,8590);
   QCmd(6,746,1163);
   ChangeFormation(742,3);
   ChangeFormation(743,3);
   ChangeFormation(744,3);
   ChangeFormation(745,3);
   ChangeFormation(746,3);
   RunScript("Kontra20",3000);
   Suicide();
   end;
end;

когда в траншее первого рубежа остается меньше половины обороняющейся там пехоты, пехота выходит из траншеи второго рубежа и атакует траншею первого рубежа, с посадкой в нее(атакует врага если он к тому времени уже занял траншею, а если там еще свои, то просто присоединяется к ним и продолжает обороняться вместе с ними)

+1

219

Пауза всегда возникает между командами, юнит становится в относительно-начальную позицию для выполнения следующей команды.
Промежуток времени небольшой, но для пехоты может быть фатальным, при наличии плотного огня, поэтому если расстояние небольшое, то лучше сразу давать конечную команду
войти/выйти в окоп/здание, потому как эффекта атаки на небольшом расстоянии будет абсолютно небольшой и перекроется убытком от огня

0

220

Вот, сразу появилась тема для обсуждений. Спасибо мужчины за образцы, буду пробовать оба варианта (кстати по паузе -для меня лично не критично, ждать друг друга не будут, у меня все пехотинцы по одному, отделения редко использую).

Отредактировано alex (2011-04-05 02:59:52)

0

221

народ, подскажите имеет ли значение пробел между RunScript и скобкой или между другой ф-цией или скобкой? заранее благодарен

0

222

ИС 3 написал(а):

народ, подскажите имеет ли значение пробел между RunScript и скобкой или между другой ф-цией или скобкой? заранее благодарен

Имеет. Его быть не должно. После названия ф-ции (RunScript тоже ф-ция) сразу же скобки.

0

223

теперь понятно почему скрипт не работал...спасибо :flag:

0

224

Убедительная просьба к знающим проверить мой скрипт на наличие ошибок в ф-циях т.к. сам уже много раз проверял и ничего не нашёл(скрипт довольно небольшой, всего 180 строчек, скачать можно тут)

0

225

Убедительная просьба к знающим проверить мой скрипт

Сбрось карту и сценарий, для которых написан скрипт. Завтра (5 мая) постараюсь проверить.
Да, и укажи, на какой основе сделана карта (БК, мод, GZM и т.п.)

0

226

Карта делалась на основе ГЗМ 7.50.1 (саму карту скинул в ЛС)

0

227

Для ИС-3.
1) Функцию Init нужно написать с большой "I".
2) Зону "baranovichi" везде прописать с маленькой буквы, то есть везде одинаково.
Напиши, если игра заведется.
Да, а что это за ЛС, куда скинута карта?
И еще. В отладочной функции замени активацию чит-режима на @Password( "www.dtf.ru" ), если карта для ГЗМ.

Отредактировано yersinia (2011-05-05 20:55:20)

0

228

yersinia написал(а):

1) Функцию Init нужно написать с большой "I".
2) Зону "baranovichi" везде прописать с маленькой буквы, то есть везде одинаково. И еще. В отладочной функции замени активацию чит-режима на @Password( "www.dtf.ru" ), если карта для ГЗМ.

Учту, щас попробую.

yersinia написал(а):

Да, а что это за ЛС, куда скинута карта?

ЛС-личные сообщения(вверху есть пункт "Сообщения")

0

229

yersinia написал(а):

Напиши, если игра заведется.

Скрипт заработал, спасибо вам большое! :jumping:

0

230

Вопрос для мастеров скрипта - как сделать зоны (участки карты) постоянно просматриваемые противником, даже при его отсутствии в данной зоне (не везде приемлимы снайперы в засаде).

Отредактировано alex (2011-06-30 00:17:01)

0

231

(GetNUnitsInArea(0, "xxx") > 0)
скрипт учитывает каждого пехотинца (не сквад) отдельно

0

232

alex написал(а):

как сделать зоны (участки карты) постоянно просматриваемые противником, даже при его отсутствии в данной зоне (не везде приемлимы снайперы в засаде).

Можно использовать функцию ViewZone (“Name”, iParam)
(при iParam = 1 открывает туман в области круглой сценарной зоны "Name"; при iParam = 0 закрывает туман)
Зона открывается и для той и для другой стороны. Однако, для того чтобы ИИ(противник) не просто наблюдал юнитов игрока в освещенной зоне, а еще и предпринимал какие-то действия, например вел артобстрел по юнитам игрока при входе их в эту зону, можно создать "поверх" этой зоны оборонительную зону для ИИ(в тулзе AISetting) и дать его юнитам соответствующие команды, например стартовые в редакторе. Тогда при входе юнитов игрока в эту зону пушки ИИ будут открывать по ним огонь, а иначе просто молча будут наблюдать. Вобщем могут быть разные варианты.

+1

233

ilyaka написал(а):

Можно использовать функцию ViewZone

Спасибо Ilyaka за пример! Щас буду пробовать варианты.
Мне вот для какой ситуации нужен этот скрипт. На скриншоте - пересохшее русло реки должны пересечь войска игрока, русло на месте перехода заминированно. И вот по идее под огнем противника (2 миномета 80мм) саперы должны разминировать участок, а потом его должна проскочить техника - место переправы должно быть видно компу. Я уже ввел новых юнитов - наблюдателей (они гражданские по виду, но с параметрами снайперов, безоружны и игрок замечает их только когда на них буквально наступит (если они в засаде)), но даже эти наблюдатели не помогают, ведь то место, с которого они ведут наблюдение перекрывается частично растительностью (размещать ближе к переправе не получится, накроет своим же огнем) - выход один сделать зону постоянно доступную для просмотра компу, если даже в ней нет его юнитов.

Отредактировано alex (2011-06-30 16:47:00)

0

234

Ну в принципе для данной ситуации, то что я описал вполне может подойти. Можно прописать чтобы зона открывалась только когда туда войдут саперы и закрывалась когда их там не будет. Или можно обойтись и без открытия этой зоны, да и без наблюдателей тоже, можно просто прописать условие когда при проникновении в обозначенную зону саперов, минометы будут вести обстрел по этой зоне, и прекращать когда там никого не будет. Или совместить. И т.п. Вобщем тут варианты могут быть разные, это уже на твое усмотрение.

0

235

Может кто то в курсе, каким образом записывать и считывать информацию из файлов в нашем lua  :question:
Топчусь где то около, но понять не могу.
Вот ссылки кому интересно, на справочники по операторам lua

http://www.lua.org/manual/5.1/
http://ilovelua.narod.ru/

0

236

Поправьте меня если я неправ.

Если мы берем функцию GetNUnitsInArea() то каждый солдат в кваде, это отдельная единица, а когда берем функцию GetNUnitsInScriptGroup(), то отдельной единицей будет являтся сам квад целиком, без учета кол-ва бойцов в нем, ведь так?

Вопрос для меня стал актуален, потому что мне необходимо проконтролировать пооголовье пехоты не по взводам а именно в целом, по общему количеству пехотинцев.

0

237

Кто может конкретно объяснить плюсы организации патруля вот таким способом:


function EINSDT135()

local ScriptAreas = {};
ScriptAreas[135] = "MZENSK_2";

local coeffs = {};
        coeffs[135] = 100000;

local delays = {};
        delays[135] = 7000;

local ACTION_SWARM = 3;
local PatrolID = 135;
local vector = {x = 0, y = 0};
local center = {x = 0, y = 0};

if ( GetNUnitsInScriptGroup(PatrolID) <= 0) then Suicide(); end;
center.x, center.y = GetScriptAreaParams( ScriptAreas[PatrolID] ); -- center of patrol area

if ( GetNUnitsInScriptGroup(PatrolID) >= 1) then

    vector.x, vector.y = GetObjCoord(PatrolID); -- starting coordinates

    vector.x = vector.x - center.x; -- relative vector
    vector.y = vector.y - center.y;

    vector = norm( vector );

    vector.x = vector.x * coeffs[PatrolID];
    vector.y = vector.y * coeffs[PatrolID];

    SetIGlobalVar( "temp.got.coords" .. PatrolID, 1);
    SetIGlobalVar( "temp.ccw" .. PatrolID, RandomInt(2));
else
    vector.x = GetFGlobalVar( "temp.vector" .. PatrolID .. ".x", 0);
    vector.y = GetFGlobalVar( "temp.vector" .. PatrolID .. ".y", 0);
end;

local ccw = GetIGlobalVar( "temp.ccw" .. PatrolID, 0);

vector = rot45( vector, ccw );

if (CheckMapBounds( vector, center ) == 1) then -- if coord is out of map bounds
    ccw = 1 - ccw;
    SetIGlobalVar( "temp.ccw" .. PatrolID, ccw );
    vector = rot90( vector, ccw ); -- then rotate vector back
end;

Cmd (ACTION_SWARM, PatrolID, vector.x + center.x, vector.y + center.y);

SetFGlobalVar( "temp.vector" .. PatrolID .. ".x", vector.x);
SetFGlobalVar( "temp.vector" .. PatrolID .. ".y", vector.y);

RunScript( "EINSDT135", delays[PatrolID] + RandomInt(4000));
Suicide();

end;

function CheckMapBounds( ...)
local vec = arg[1];
local center = arg[2];
local xmax, ymax = GetMapSize(); -- get map bounds

if ( ((vec.x + center.x) <= 0) or ((vec.y + center.y) <= 0) or ((vec.x + center.x) >= xmax) or ((vec.y + center.y) >= ymax)) then
    return 1;
end;

return 0;
end;

function rot90( ... )
local vec = arg[1];
local ccw = arg[2];

if ( ccw == 0) then
    ccw = -1;

else
    ccw = 1;
end;

local x1 = vec.y * ccw;
local y1 = vec.x * ( -ccw);

return {x = x1, y = y1};
end;

function rot45( ... )
local sqrt2div2 = 0.7071;
local vec = arg[1];
local ccw = arg[2];

if ( ccw == 0) then
    ccw = -1;

else
    ccw = 1;
end;

local x1 = vec.x * sqrt2div2 + vec.y * ccw * sqrt2div2;
local y1 = vec.x * (- ccw * sqrt2div2) + vec.y * sqrt2div2;

return {x = x1, y = y1};
end;

function norm( ... )
local vec = arg[1];
local len1 = len (vec);

local x1 = vec.x / len1;
local y1 = vec.y / len1;

return {x = x1, y = y1};
end;

function len( ... )
local vec = arg[1];

return sqrt( vec.x * vec.x + vec.y * vec.y );
end;

function sqrt( x)
local ITNUM = 4;
local sp = 0
local i = ITNUM;
local inv = 0;
local a, b;
if ( x <= 0) then return 0; end;

if ( x < 1) then
    x = 1 / x;
    inv = 1;
end;

while ( x > 5) do
    sp = sp + 1;
    x = x / 5;
end;

a = 2;
-- Newtonian algorithm
while (i > 0) do
    b = x / a;
    a = a + b;
    a = a * 0.5;
    i = i - 1;
end;
--
while ( sp > 0) do
    sp = sp - 1;
    a = a * 4;
end;

if ( inv == 1) then
    a = 1 / a;
end;
return a;
end;

0

238

ilyaka написал(а):

Вот как пример использования этих команд:

function Kontra19()
  local A_Swarm = 3;
  local A_Enter = 6;
  local A_Leave = 7;
  local a = GetNUnitsInScriptGroup(691)+GetNUnitsInScriptGroup(692)+GetNUnitsInScriptGroup(693)+GetNUnitsInScriptGroup(694)+GetNUnitsInScriptGroup(695)+GetNUnitsInScriptGroup(696);
  if (a <= 3) then
   Cmd(7,742,10283,9825);
   QCmd(3,742,11215,8650);
   QCmd(6,742,1159);
   Cmd(7,743,10395,9820);
   QCmd(3,743,11365,8685);
   QCmd(6,743,1160);
   Cmd(7,744,10480,9825);


- и далее "пачки" команд по аналогии вышецитированным.

Относительно вашего поста № 218 (10-месячной давности, прочитал только сегодня). Имеет ли смысл устанавливать локальные переменные (кроме "local a" в приведенном примере), если в функции, где они объявлены, не используются? (лишняя нагрузка на систему и т.п.).
Но главное, почему я обратился к старому сообщению. Интереснейшая фишка: если пехота сидит в окопе или здании, а ей нужно, в какой-то момент игры, пойти атаковать противника, то можно не давать команду № 7 ("покинуть задние или окоп"). Задав пехоте первую команду № 3 ("следовать в боевой готовности") пехота без команды № 7 сама выходит из здания или окопа и идет с атакой в заданную точку (но не ссаживается с танка!). Проверено несколько раз на пробных картах.

0

239

Объясните пожалуйста, какие x,y надо подставлять в AskClient (“SetCamera(x, y)”) пробовал и скриптовые ,и VIS координаты, результат не тот.

Отредактировано ИС 3 (2012-02-18 20:11:04)

0

240

ИС 3

Это вообще криво работает и желательно не использовать
Нужно ставить скриптовые координаты

0


Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты