Сиюминутный оффтоп, если никто не возражает. Как вам кажется, народ активно осваивает ZScript, или он остаётся уделом нескольких упёртых? Как обстоят дела с туториалами? Синтаксис еще развивается?
Как вам кажется, народ активно осваивает ZScript, или он остаётся уделом нескольких упёртых?
Смотря где. В русскоязычной среде относительно знающих ZScript по пальцам пересчитать можно, в англоязычной в основном на нём разговоры и ведутся. Мануалы -- только ZDoom wiki, расспросы что-то уже знающих да анализ чужого кода. Синтаксис -- да, развивается, и несколько моих любимых функций работают уже не так, например, нет флага "level.frozen", он теперь зачем-то превращён в функцию "level.SetFrozen( bool on )".
Описание: В альт-худе дума указывается текущее количество убитых монстров и их общее количество в уровне (через дробь. Пример: 135/443). НО когда играешь в кооперативе это значение у каждого игрока нужно каждый раз суммировать, дабы знать - сколько реально убито и сколько еще живности на уровне дышит, т.к. у каждого игрока пишется количество убитых именно им монстров. Особенно это напрягает когда игроков больше двух.
Подробно что должен делать скрипт: Просьба написать Z-скрипт так (если это возможно конечно), чтобы одно из значений указывало общее количество убитых монстров всеми игроками - например так 135/402/443 (135 убил ВАСЯ, 402 убитых всего, 443 вообще монстров в уровне). И тоже самое на секреты и предметы.
Хотелось бы прояснить следующие вопросы:
1) На уровне хаба запускается скрипт N1 с циклом While ( ), длящийся некоторое время, игрок выходит на соседний уровень в хабе, затем сразу же возвращается обратно. При входе на карту в библиотеке прописан запуск скрипта N1, если выполняется условие. У игрока оно выполняется. Но на карте скрипт N1 уже был запущен ранее. Вопрос: будет ли продолжаться действие ранее запущенного скрипта или скрипт из библиотеки перезапустит его? Если запущенный ранее скрипт продолжает работать, то запуск из библиотеки не сработает?
Все запуски скрипта - через ACS_NamedExecute.
Пример скрипта:
2) Команда ACS_Terminate как именно прекращает действие скрипта с циклом While (см. пример выше)?
Скрипт обрывается сразу или действие в цикле проиграется до конца времени 35 тиков, прежде чем скрипт завершится? Скажем, если команда ACS_Terminate поступила в то время, когда в скрипте работала задержка (например, прошло 15 тиков из 35), то как сработает эта команда?
2) ЕЯПП то ACS_Terminate прерывает любой скрипт, который при этом НЕ является типом ENTER, НЕ вызван через ACS_ExecuteAlways или НЕ работает на другой карте кроме той где вызывается сам ACS_Terminate:
Using ACS_Terminate is exactly the same thing as using terminate within that script, except that it can be called on scripts that are currently "running" (see below) on other maps in the same hub. The target script, if it's in the same map, is immediately halted. A subsequent call to the same script will start it over from the beginning.
Что касается прерывания внутренних циклов скрипта то чек на выход ACS_Terminate (или terminate;) должен находиться внутри цикла:
Termination of course only makes sense in scripts that have code that runs for more than one tick. Thus, yes, tehy can be terminated at any point via terminate. You could use a workaround for outside termination by calling another ACS script that in thrun switches a bool to false and the looping script, each cycle, checks if the loop is true and if not, terminates itself (the bool would have to be set teh true before the loop is started, of course).
Void Weaver Спасибо, опытным путем установил, что если скрипт был запущен ранее, то новый запуск через ACS_Execute не сработает. Прерывание скрипта делается сразу по ACS_Terminate. А вот так, как советуют в цитате ("изменять переменную, которая используется в цикле скрипта"), не годится, т.к. если цикл имеет какую-то длительность, то смена переменной начнет работать лишь после того, как завершится длительность текущего цикла (в начале которого переменная была True), что может вызвать рассинхрон с другими скриптами по задумке.
Так что лучше напрямую, ACS_Terminate.
Описание: Скрипт мышки с двумя кнопками, есть поддержка 3-х сигналов, Pressed, Just-Pressed, Released. Также, по рекомендации ZZYZX, добавил игнорирование m_yaw, m_pitch и invertmouse.
Как добавить: добавляешь содержимое pk3, в свой pk3, и в нужном тебе месте вызываешь скрипт "drawMouse". Синтаксис у него следующий:
drawMouse(включен, tid_игрока)
где,
* Если включен не 0, то появляется мышка. Через этот аргумент можно включать/отключать мышку.
* tid_игрока - tid игрока которого замораживает, при использовании мышки.
Также, настройка происходит через cvarinfo, там задается разрешение экрана (SetHudSize), чувствительность мышки, также там хранятся координаты, флаги, и т.д. и т.п.
Ссылка\код: Скачать pk3 с MEGA
Может ли кто-то помочь в написании скрипта разделения кнопки USE/Open/Respawn на две отдельные: USE/Open и Respawn? Жутко мешает одному из 6-и наших "кооперативщиков", т.к. во время смерти она случайно (на постоянной основе) жмет машинально кнопку и соответственно респавнится, теряя весь инвентарь (злясь на всех и вся). Естественно воскресить после респавна уже нельзя, и поэтому она требует чтобы все шестеро вышли и загрузили сохранение ...
Заказ на Z-скрипт от: YURA111
Подробно что должен делать Z-скрипт: Разделение кнопки USE/OPEN/RESPAWN на две различные USE/OPEN и RESPAWN
По причине того, что я и прошлого ZScript-игрока Юрию в его мод частично делал, возьму и на этот раз.
Пересылаю сюда окончательный код с согласия обеих сторон. Его внушительный объём -- последствие почти незаметной оптимизации (перекопировал оригинальный "DeathThink()" и поменял код респауна в нём, без вызова "Super.DeathThink()" -- метода родителя).
Принцип действия -- вместо "+USE" при смерти проверяется та последовательность, что находится в "const respawnButtons" (полный список доступных здесь клавиш можно найти в /zscript/constants.txt). Также после каждой смерти единожды выводится строка, записанная в "const deathMessage". Выводится неэлегантно, но тут иного и не нужно.
Скрытый текст:
class DoomPlayer_4YURA: DoomPlayer replaces DoomPlayer {
const respawnButtons = BT_USE + BT_ALTATTACK + BT_BACK;
//const respawnButtons = BT_USER4;
// Последовательность клавиш -- через "+" или "|". Но вообще с масками через прибавление/вычитание лучше не работать (часто просто опасно).
const deathMessage = "Press \c[Red][USE] + [ALTFIRE] + [BACKWARD]\c- to respawn...";
bool deathMessageShown;
override void OnRespawn() {
deathMessageShown = false;
Super.OnRespawn();
} // of override void OnRespawn() {
override void DeathThink() {
let player = self.player;
int dir;
double delta;
player.Uncrouch();
TickPSprites();
if ( !deathMessageShown ) {
A_Print( deathMessage .. "\n\n\n\n\n\n\n" );
deathMessageShown = true;
}
player.onground = (pos.Z <= floorz);
if (self is "PlayerChunk") { // Flying bloody skull or flying ice chunk
player.viewheight = 6;
player.deltaviewheight = 0;
if (player.onground && Pitch > -19.) {
double lookDelta = (-19. - Pitch) / 8;
Pitch += lookDelta;
}
} else if (!bIceCorpse) { // Fall to ground (if not frozen)
player.deltaviewheight = 0;
if (player.viewheight > 6)
player.viewheight -= 1;
if (player.viewheight < 6)
player.viewheight = 6;
if (Pitch < 0)
Pitch += 3;
else if (Pitch > 0)
Pitch -= 3;
if (abs(Pitch) < 3)
Pitch = 0.;
}
player.mo.CalcHeight ();
if (player.attacker && player.attacker != self) { // Watch killer
double diff = deltaangle(angle, AngleTo(player.attacker));
double delta = abs(diff);
if ( delta < 10 ) { // Looking at killer, so fade damage and poison counters
if (player.damagecount)
player.damagecount--;
if (player.poisoncount)
player.poisoncount--;
}
delta /= 8;
Angle += clamp(diff, -5., 5.);
} else {
if (player.damagecount)
player.damagecount--;
if (player.poisoncount)
player.poisoncount--;
}
// Условие страшное, но такое было в оригинале. Даже поглотить один старый пункт получилось, взамен на новый.
if ( ( !sv_norespawn
&& ( ( player.cmd.buttons & respawnButtons ) == respawnButtons
|| ( (multiplayer || alwaysapplydmflags) && sv_forcerespawn) ) )
&& ( level.time >= player.respawn_time || player.Bot == NULL ) ) {
player.cls = NULL; // Force a new class if the player is using a random class
player.playerstate = (multiplayer || level.AllowRespawn || sv_singleplayerrespawn || G_SkillPropertyInt(SKILLP_PlayerRespawn)) ? PST_REBORN : PST_ENTER;
if (special1 > 2)
special1 = 0;
}
} // of override void DeathThink() {
}
Щас пришла в голову поехавшая идея, навеянная маньяками с думворлда, впадающими в пляску святого Витта при подозрении в копировании вами пары вертексов со стандартных карт.
Можно ли как-либо (всё равно как) сделать так, что бы вад с определёнными iwad не фурычил?
Ибо благодаря ссаному фридуму - за что ему огромнейшее и бесконечное спасибо - мы теперь имеем уникальный бонус в виде сомнительности распространения модифицированных карт оригинала.
SLON Если обсуждать техническую сторону, то в ZScript есть возможность чтения загруженных в память вадах определённых лампов, а значит, и проверки их наличия (это же, но немного в другой форме, используется при определении типа игры, который показывается в верхней части окошка при запуске порта: исходник). Вот пост об этой функциональности: forum.zdoom.org.
Что делать с другими портами (включающими UDMF), не совсем ясно, но костылей каких-нибудь наверняка навешать можно.
Ну это так, просто на уровне поверхностных размышлений.
В принципе можно просто распространять подобные аддоны вместе с изменённым портом.
Но это "защита от дурака", а не от прошаренного пользователя, так как ничто не помешает ему запустить это с чем-то другим. Тут уже если только свой форк делать, с вадом использующим нестандартные схемы (т.е. например не декорейт/дехакед, а его уникальный аналог). Хотя это уже тяжёлая наркомания по сути.
Так что я предвижу два варианта:
1. Думворлд и ко перестаёт страдать подобными девиациями.
2. Они продолжат это делать, и рано или поздно становятся синонимами всего матерного. Оттуда все уходят, остаётся лишь кучка членов BDSM секты копирайта.
Исходя из всего происходящего, пока всё движется ко второму варианту.
SLON В конце концов, "прошаренный" пользователь может и выдрать отдельно карты из архива, чуть более "прошаренный" --- дизассемблировать экзешник, если все ресурсы упакованы в него, и т. п. Кроме того, есть шанс потерять значительную часть аудитории (например, лично я бы просто не стал качать модификацию со своим исполняемым файлом, если без его запуска нельзя обойтись).
О предоставленной альтернативе --- у тамошней администрации появились какие-то претензии к конкретным работам?
Претензии там по факту даже не успевают возникать, любое подражание оригиналу запрещено. Я вообще удивлён, как там Doom Tribute в архив прошёл. Наверное, по "недосмотру".
Просто, если я правильно понимаю, могут прицепиться к ваду, который содержит уровни оригинальных IWAD'ов с минимальными изменениями, где работа автора заключается лишь в паре-тройке измененных текстур и двух добавленных комнатушках.
К Doom Tribute в этом случае докопаться труднее: там геометрия уровней с нуля создана, а перводумовские служат лишь "источником вдохновения".
могут прицепиться к ваду, который содержит уровни оригинальных IWAD'ов с минимальными изменениями, где работа автора заключается лишь в паре-тройке измененных текстур и двух добавленных комнатушках.
это сделано потому что "ну просто мы так захотели", или потому что их сайт могут прикрыть за копирайты?
Архив idgames, насколько я знаю, управляется не администрацией DW. Раздел /idgames на DW --- это просто база данных о содержимом внешнего ftp-хранилища с вадами (ещё немного об этом можно почитать здесь).
А "золотая цитата" вообще от какого-то непонятного обычного участника, даже не модератора. Я бы тоже мог прийти туда и написать там какую-нибудь свою ахинею, разве это поменяло бы что-нибудь в правилах архива?
Лично я не думаю, что в этом вопросе стоит обращать особенное внимание на личные предпочтения людей, никакой прямой власти над архивом не имеющих.
theleo_ua Там же "almost no difference with the original", так что Ctrl + J, наверное, всё-таки "не пройдёт". А вот сколько это --- almost --- в каждом случае решается по-своему и обычно зависит от степени совместимости автора с генеральной линией партии, как и по всем остальным вопросам. Но это не очень сильно влияет на архив --- там решения всё-таки принимают другие люди.