Скрипты Lua в Se3: Начало Часть1


Объект Entity 
  • объект, который появляется в игре. Любой звук, геометрия, эффект, фон, невидимое и т.д.  Entity делятся на классы.Каждый объект в мире присваивается уникальный идентификатор при создании. Все Entity имеют две общие характеристики: "Имя" и "Родитель".
  • все объекты Entity (различного класса) доступны в дереве вкладки EntityList
КЛАССЫEntity
  • название класса у Entity можно узнать в свойствах закладки Entity на верхней строке.
  • ОСНОВНЫЕ  КЛАССЫ у Entity :
  1. СWorldInfotProperties - Entity контроллер карты
  2. СStaticModelProperties -  Entity любая статичная модель в игре (ящик,здание и т.д.)
  3. СPropProperties -тоже что и СStaticModelProperties, только здесь доступно ещё использовать редактор коллизии  с физикой. 
  4. CExternalJointProperties - Entity привязка (например связать два СPropProperties)  и т.д.
КЛАСС  CScriptProperties 
  • Так же есть класс, который отвечает за выполнение скриптов в создаваемой карте CScriptProperties  EntityList именуется как Script в папке Logic)
  • CScriptProperties- это скрипт или программируемый код языка Lua
  • язык Lua
Подробно я не буду говорить об этом языке т.к. в интернете можно найти литературу. Можно отметить что Lua Является свободно распространяемым, с открытыми исходными текстами на языке Си, где сам язык Lua дополняет Си присутствием динамического контроллера типов (переменной допускается менять свой тип самостоятельно).
  • Редактор Lua  открывается при двойном клике на правую кнопку мыши по Entity Скрипту на карте (после добавления из EntityList на карту он выглядит в виде темно-оранжевого кубика) (например: вкладка Script001)

КАК ПРИСВАИВАТЬ ПЕРЕМЕННЫМ редактора Lua класс Entity из SE3 
  • в  редакторе Lua  пишем любое символьное имя например: m - это и будет новая переменная, к которой мы присваиваем любой Entity
  • далее перетаскиваем мышью  (при этом нажав Ctrl+Alt+Shift - на самом деле это копирование Entity) выбранный Entity из Карты (например ящик СStaticModelProperties) в 
    редактор Lua  к m (при перетаскивании мы видим +)
  • если все сделано правильно, то  в  редакторе Lua  переменная m окрашивается в зеленый цвет. В результате чего мы видим ниже описание: Variable m присвоено значение Handle
  • Когда мы поставим точку перед переменной m, то увидим красную черту, а при наведении на саму m появляться  пояснение, что это СStaticModelProperties. Красная черта означает, что необходимо дописать код. На самом деле точка открывает доступ к свойствам объекта (как и в другом любом языке)
  • Закоментированный код в редакторе выглядит (без русских символов):--Comment 


СОХРАНЕНИЕ СКРИПТА
  • Сохранить скрипт в файл формата Lua можно, открыв вкладку Entity этого  CScriptProperties и наведя курсор на Значение (Value) свойства Script нажимаем правой кнопкой мыши выбираем Save или Save As... (аналогично загрузка через Browse...)

ПАНЕЛЬ RCon:Local
  • RCon:Local- информационная панель, откуда можно узнать наличие ошибок  скрипта Lua или вывести какие-нибудь данные . Командную Панель RCon:Local можно активировать в View-RCon:Local 
         например напишем в редакторе:

print(Text...Text)
  • print("мой первый скрипт")
  • при запуске игры Ctrl+T в панели RCon:Local выведет мой первый скрипт
СИНТАКСИС ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ В Lua


--ПРИМИТИВНЫЕ ТИПЫ

local a --объявили одну переменную как nil
local a,b,c... --объявили несколько переменных как nil
--объявление переменных со значением типа Boolean,Float,String,Table
local b=True
local a=1.0015
local text="Текст"
local t={a1,a2,...}

--ТИПЫ SE3
local a=function()

--Явное объявление переменной SE3
назначение переменной a через комментарий путем выбора после знака : тип нажав (Ctrl+Space) 
--a:СStaticModelEntity

entityVariable:MemberFunction() --Вызов функций переменной entity
entityVariable.SomeEvent --Вызов Свойств переменной entity
  
worldInfo 
 глобальная переменная, в которой сидит класс СworldInfoProperties (нет необходимости его присваивать вручную)

worldGlobals 
объект, который содержит глобальные свойства карты, откуда можно получить все объекты определенного класса

  • а=worldGlobals.worldInfo: GetWorldFileName() --String
    получаем путь (в виде строки), где хранится файл карты 

КАК ПОЛУЧИТЬ ВСЕ Entity Карты с ОДИНАКОВЫМ КЛАССОМ
  • local m=worldGlobals.worldInfo:GetAllEntitiesOfClass("CExternalJointEntity")
  • print(m)  
в RCon:Local напишет например table:735D38F0, означает что m-это переменная с типом таблица с идентификатором 735D38F0,где сидят все Entity с одинаковым классом CExternalJointProperties

КАК ПОЛУЧИТЬ Entity Карты по id
  • local model worldGlobals.worldInfo:GetEntityByID("CStaticModelEntity",id)


Простейшие Операции и выражения

Простейшие операторы: 

and 
or

  • b=type(a)--String  

узнаем тип переменной a (возвращает строку)

1. Выражение

    • a==b --Boolean- равно
    • a<=b --Boolean - меньше равно 
    • a>=b --Boolean - больше равно 
    • a<b --Boolean - меньше 
    • a>b --Boolean - больше 
    • a~=b --Boolean - не равно
          2. Условные Операторы
  • if  Выражение  then ... end 
Если выполняется Выражение  тогда ...

3. Функции в SE3

  • H=mthDegToRad(DegH)--Float
  • P=mthDegToRad(DegP)--Float
  • B=mthDegToRad(DegB)--Float

  • q=mthHPBToQuaternion(H,P,B)--Quaternion4f (угол)
  • H=q.h --Float
  • P=q.p --Float
  • B=q.b --Float
  • V=mthVector3f(x, y, z)--Vector3f (вектор)
  • x=V.x--Float
  • y=V.y--Float
  • z=V.z--Float
     
  • QV=mthQuatVect(q, V)--QuatVec 

  • q=QV:GetQuat()--Float

  • H=QV.qh --Float
  • P=QV.qp --Float
  • B=QV.qb --Float

  • V=QV:GetVect()--Float

  • x=QV.vx --Float
  • y=QV.vy --Float
  • z=QV.vz --Float
     

  • QV=entity:GetPlacement()--QuatVec
  • entity:SetPlacement(QV)
ОБЪЯВЛЕНИЕ ФУНКЦИИ  
  • local function Name(param1,param2...)...Return Result...end
  • function worldGlobals.Name(param1,param2...)...Return Result... end
  • function thisScript Name() ...Return Result... end
    вызов в другом скрипте scriptName:Name()
пример:

function worldGlobals.SetEntityPosition(entity, vNewPosition)
 
entity:SetPlacement(
mthQuatVect(entity:GetPlacement():GetQuat(),vNewPosition))

end

вызываем:
  • worldGlobals.SetEntityPosition(modelV)
установить модель Entity на карте в положение с координатами V

ОБЩИЕ ФУНКЦИИ Se3

Wait(filtr) --блокирует код на определенное время пока filtr не возвратит true
WaitForever() --блокирует код навсегда пока не остановился мир

ВСЕ О СОБЫТИЯХ (Event) В SE3
  1. Создание,Получение Значения События через wait
  • CustomEvent("Имя нового события")--Boolean
  • CustomEvent(объект,"Имя нового события") --Boolean
  • CustomEvent(объект,"Имя нового события",ЗначениеСобытия)--ЗначениеСобытия   
  • 2. Событие
    Event(entityVariable.SomeEvent)--Boolean
    SignalEvent("ИмяСобытия")--Boolean
    SignalEvent(объект, "ИмяСобытия")--Boolean
    SignalEvent("ИмяСобытия",Таблица)--
    Таблица
    SignalEvent(объект, "ИмяСобытия",ЗначениеСобытия)--
    ЗначениеСобытия
 

ОБЩИЕ ФУНКЦИИ у Entity моделей видимых классов на карте

  • model:SetStretch(0.9) --изменить размер Entity модели на 0.9 (FLOAT)
  • model:Dissapear()--модель будет не видна на карте
  • model:Appear() -- модель будет не видна на карте


Все о ПЕРЕМЕННОЙ с Типом Таблица (Table) 

  • Явное объявление Таблицы
                Table={[key1]=value1,[key2]=value2 ,...}
 
вызов:

value= function() ... end --Любое значение
key=имя--String
 
local f Table [key]
  • Свойства Table
  1. m[i] -обращение к i (свободная любая цифра, например 1) ячейке таблицы, где сидит объект. Если i выходит за границы таблицы то возвращает значение nil (Неопределено)
  2. #m - количество индексов (в которых сидят объекты)
  3. for i in ipairs(m) do print(m[i]) end - обход всех индексов таблицы
    table.remove(m,i)  - удаление индекса i  из таблицы 

Все о ПЕРЕМЕННЫХ с различным Типом SE3

  • CBaseEntity (CPropEntity,CStaticEntity...)
CString=CBaseEntity :GetClassName() 
CString=CBaseEntity :GetName() 
CBaseEntity Handle=CBaseEntity :GetParent(IDENT idName)  
CWorldInfoEntity* =SBaseEntity :GetWorldInfo() 

Vector3f= CBaseEntity :GetLinearVelocity()
CBaseEntity:SetLinearVelocity(Vector3f vVelocity) 

Vector3f= CBaseEntity :GetAngularVelocity()
CBaseEntity:SetAngularVelocity(Vector3f vAngVelocity)

QuatVect = CBaseEntity :GetPlacement ()
QuatVector=CBaseEntity:GetAttachmentAbsolutePlacement(IDENT idAttachment) 
QuatVector= CBaseEntity :GetAttachmentRelativePlacement(IDENT idAttachment)
CBaseEntity:SetPlacement(QuatVect qvPlacement) 

СBaseEntity :InflictDamage(Slong slКоличество) --наносит ущерб СBaseEntity :InflictDamageofType(Slong slКоличество,CString 
stТипУщерба) --наносит ущерб с типом

  • CPropEntity(модель с физикой)
CPropEntity:EnablePhysics() --Включить физику
CPropEntity:DisablePhysics()--Включить физику
CPropEntity:WakeUp() --пробудить 
CPropEntity:GoToSleep() --перейти в спящий режим 

CPropEntity:DestroyOnePhase(Bool bCascadeDestruction)
Bool= CPropEntity:IsDestroyed() --разрушается
CPropEntity:ReportDamage()  

  • CExternalJointEntity (соединитель)

m:Link(a,b,"","","",""--a и b - модели СPropEntity
m:UnLink --отсоединить

  • CLeggedPuppetEntity (кукла)
  1. puppet:PlayAnim("Hello") 
  2. puppet:DropDead()
  3. puppet.DesiredPositionReached --желаемая позиция достигнута

  • CSpawnEntity
  1. spawner:SpawnSimple()--все доступные спауны
  2. spawneeAvailableEventObject=spawner.SpawneeAvailable
  3. spawnedPuppet = spawneeAvailableEventObject:GetSpawnedEntity()

Пример:
скрипт ищет объекты  CPropEntity и прикрепляет их друг к другу (по условию) 

function worldGlobals.SetLinkProps(t)
local m=worldGlobals.worldInfo:GetAllEntitiesOfClass("CExternalJointEntity")
local p1=worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity")
local p2=worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity")
local j1,k1,v1,v2,f,v

for i in ipairs(m) do

if i>#worldGlobals.worldInfo:GetAllEntitiesOfClass("CPropEntity") then
break
end

f=false

for j in ipairs(p1) do v1=p1[j]:GetPlacement():GetVect();

for k in ipairs(p2) do v2=p2[k]:GetPlacement():GetVect();

v=mthVector3f(t, 0, 0)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
--print(i) 
--print(j) print(k)
f=true;
break;
end--if

v=mthVector3f(0, t, 0)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
f=true;
break;
end--if

v=mthVector3f(0, 0, t)
if v==v2-v1 then
m[i]:Link(p1[j],p2[k],"test","test","","");
j1=j;
k1=k;
f=true;
break;
end--if

end--p2

if f then 
break;
end

end--p1

if f then
table.remove(p1,j1);
--table.remove(p2,k1);
end

end--m

end--function

worldGlobals.SetLinkProps(0.5)





Комментарии   

[Материал]  |  № 14  |  05.02.2023  |  0  
Статья крайне непонятно написана. Точнее понятно, но очень не хватает комментариев, которые бы на словах объясняли, что что делает. Тем не менее если поймать нить вникания - то дальше становится всё понятно и статья на самом деле очень полезная. Спасибо)
Ответ Цитата

[Материал]  |  № 13  |  09.07.2013  |  0  
В SED 2 сложнее. :(
Ответ Цитата

[Материал]  |  № 12  |  17.03.2013  |  0  
Lua - это хорошо)
Ответ Цитата

[Материал]  |  № 11  |  05.07.2012  |  0  
Code
model:Dissapear()--модель будет не видна на карте
model:Appear() -- модель будет не видна на карте

Ашибка
Ответ Цитата

[Материал]  |  № 9  |  21.01.2012  |  0  
Мдаа... Кстати насчет языка Lua, я все скрипты на Английском пишу и все отлично и никаких Lua, Shmua мне не нужно! :D
Ответ Цитата

[Материал]  |  № 8  |  07.01.2012  |  +1  
я не многое понял в этой статье, все очень сложно X_X
Ответ Цитата

[Материал]  |  № 7  |  05.01.2012  |  +4  
Я люблю систему триггеров в СЕД1/СЕД3 потому что она понятна и чего скрывать, легче. А система "многа букф" в СЕД2/СЕД3.5 просто отвращает...
Ответ Цитата

[Материал]  |  № 10  |  04.02.2012  |  +1  
"многабукаф" в разы мощней.
Ответ Цитата

[Материал]  |  № 6  |  05.01.2012  |  +2  
Многа Букаф %)
Ответ Цитата

[Материал]  |  № 5  |  02.01.2012  |  0  
не, это не для меня, но если только часть :)
Ответ Цитата

[Материал]  |  № 3  |  01.01.2012  |  0  
Сложно понять. Но пригодится. :)
Ответ Цитата

[Материал]  |  № 2  |  01.01.2012  |  0  
Не в тему но, можете сделать статьи по SDK для SED1?
Ответ Цитата

[Материал]  |  № 4  |  02.01.2012  |  0  
Уже есть. Поищи в статьях.
Ответ Цитата

[Материал]  |  № 1  |  01.01.2012  |  +1  
Сразу видно, статья написана программистом, и, скорее всего, для программистов, каковых среди мапперов не очень много. Обычным мапперам будет сложно понять. К тому же, практической пользы от статьи немного, опять же, по большей части, из-за ее мудрёности.
Ответ Цитата

Оставьте комментарий

Мини-профиль

Гость

Вы в группе: Гости
Ваш IP: 3.141.24.134

Сейчас обсуждают

Mindbreak1664
HoBu4oK7
maximmoz2454
AzuNeko5
SeriousRoman27
BaBuinel41
Boffy61
BaBuinel5
AzuNeko6
Ar2R-devil-PiNKy18

МЕМЫ

НОВЫЙ
Serious_Stepan 3 1

Файлы

-SR-
450 37 2

Kadath
4712 521 6

Tenshi
3360 946 13

Tenshi
3496 818 21

T02my
2515 700 3

Категории раздела

Croteam [4]
Материалы по студии разработчика игр CroTeam.
Интервью с разработчиками [9]
Интервью с разработчиками, а также их издателями.
Serious Sam 1 [9]
Статьи о Serious Sam 1
Serious Sam 2 [6]
Статьи о Serious Sam 2
Serious Sam HD [4]
Статьи о HD-серии, ремейков классических версий Сэма.
Serious Sam 3: BFE [10]
Статьи о Serious Sam 3: BFE
Уроки по Serious Editor 1 [60]
Уроки по Serious Editor 2 [3]
Самое серьёзное редактирование, на русском!
Уроки по Serious Editor 3 [40]
Уроки по работе с редактором.
Serious Engine [6]
Описание возможностей всех движков компании Croteam
Разное [26]
Всё что не подошло не под одну из вышеупомянутых категорий.
Serious Sam: Revolution [1]
Материалы по SS: Revolution, серьёзном обновлении классических Крутых Сэмов.
Serious Sam 1.05/1.07 SDK [10]
SDK - набор исходников для Serious Sam: The Second Encounter 1.05/1.07.

Видео

Serious Lяп. Тридцать восьмой выпуск
179 5.0

Выживание в Затопленном Городе: Бесконечные перезапуски! - Aftermath (Serious Sam Map) №5
147 5.0

Обновлённый "Нож брутальным хватом"
222 5.0

Serious Sam Xbox - улучшенная классика
252 5.0

Взрывная поездка в прошлое - Aftermath (Serious Sam Map) №4
173 5.0

Статистика



На сайте: 13
Гостей: 12
Пользователей: 1
HoBu4oK