PRO Mods - Forums
PRO Mods
Ваш ID: Guest
Recent messages\ Последние сообщения форума · Users list\ Список пользователей · Site search\ Поиск
  • Страница 1 из 2
  • 1
  • 2
  • »
Добавление объектов на карту
RAXATДата: Суббота, 2011-04-16, 14:30:23 | Номер сообщения: 1
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

Данный туториал позволит вам добавлять свои собственные здания, сооружения, строения, деревья, памятники и иные объекты (далее - "Объекты") в любую карту в игре, в том числе в город, вопреки убеждению о том, что город не поддаётся модификации. С сегодняшнего дня вы сами можете модифицировать город.

Для начала попробуйте свои силы в добавлении на карту тех объектов, которые уже есть в игре. В качестве примера я использовал объект "tabla_b", который представляет собой небольшую подвижную рекламную конструкцию.

Действие 1: Определение объекта
Первый шаг это выяснение typeid этого объекта. Для этого я открываю файл objects.rdb и ищу в нём строку с ключевыми словами "alias" и "tabla_b", результат поиска представлен ниже:



Отсюда видно, что данному объекту соответствует typeid 0x00000172, запомним его и перейдём ко второму действию.

Действие 2: Размещение объекта на карте
В этом действии мы будем работать только с Java файлом. Что это такое? Каждая карта запускается игрой только через специальный Java файл, у которого есть два основных отличительных признака:

1. Этот файл использует методы класса Track, о чём говорят ключевые слова "extends Track" в самом верху;
2. В файле обязательно есть объект map, это и есть карта, которую он инициализирует.

Как только вы нашли такой файл, вы можете начать его редактировать. Для того, чтобы обозначить наш первый объект на карте, мы должны его задекларировать, т.е. прописать в заголовке файла его название:

Цитата
package java.game;

import java.lang.*;
import java.io.*;
import java.util.*;
import java.util.resource.*;
import java.render.*;
import java.render.osd.*;
import java.sound.*;


public class test extends Track
{
GameType gt;

public test()
{
map = new GroundRef( multibot.maps.test:0x00000001r );
}


В этом коде пурпурным цветом выделена базовая часть, с неё начинается любой файл Java, я выделил её только чтобы показать, с какого места следует искать заголовок. Синим цветом выделено название Java файла, оно может быть другим, всегда помните этот момент. Зелёным цветом выделена открывающая скобка (символ "{"), именно со сдедующей за ней строки начинается сам заголовок, в котором красным цветом выделено то, что вы должны добавить в файл.

Фактически, в заголовке появляется только строка
Код
GameType gt;
, которая означает, что вы добавили объект класса GameType под именем gt, это имя далее будет применяться в коде.



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

    
Код
public void enter( GameState prev_state )
              {


Точка входа представлена процедурой, т.е. это целый перечень операций, которые производит игра. Ваша задача - добавить размещение объекта на карте в список этих операций. Для этого ищем далее строку по ключевым словам "posStart = new Vector3", в моей карте результат поиска указывает на следующее:

  
Код
posStart = new Vector3(-1597.392,-294.486,-1329.904);


Это координаты машины игрока при попадании на карту. Поставьте курсор к последнему символу в этой строке, нажмите Enter, чтобы перейти к следующей строке и введите код:

Цитата
gt = new GameType();
gt.create_native( map, new GameRef(objects:0x00000172r), "0,0,0,0,0,0", "test_object" );
gt.setMatrix( new Vector3(-1577.392,-294.486,-1329.904), new Ypr(-1.303,-0.003,0.000) );


Красным цветом обозначен typeid нашего объекта, мы искали его в первом действии. Синим цветом указаны его параметры, не меняйте их. Пурпурным цветом выделено название объекта - называйте его как угодно, название используется только для отладки. Метод new Vector3 определяет координаты объекта в плоскостях X,Y и Z, а метод new Ypr задаёт углы его вращения в радианах по позициями Yaw, Pitch и Roll (YPR), которые соответствуют вращению по одной из трёх возможных осей. Вы сами задаёте эти два параметра в зависимости от карты, которую вы редактируете.

Внимание! когда вы работаете с Java, обязательно соблюдайте синтаксис языка Java! Любое его нарушение может привести к возникновению ошибки "syntax error".

После совершения всех этих действий можно сохранить файл, запустить игру и посмотреть результат:

Очевидно, объект появился на карте


И его можно сбить машиной


Теперь вы умеете добавлять стандартные объекты игры на любую карту smile Ниже разберём, как можно заменить эти объекты на собственные.

Как вы уже поняли, принцип работы объектов полностью повторяет принцип для деталей: это файл CFG, в котором описаны рендер, физический каркас, масса, прочность, материал, иные параметры.

Разберём CFG объекта на примере того же tabla_b, чтобы вы смогли разобраться, как это всё устроено. Сначала я открою сам файл tabla_b.cfg, он будет содержать следующее:

Цитата
bounds 0.008519 -0.000806 -1.146981 1.008519 1.500000 -0.003551
body 0.508519 0.55 -0.575266 0.000000 0.000000 0.000000 100 objects\meshes\tabla_b\phys_01.scx
render 0x00000438 0.508519 0.5 -0.575266 0.000000 0.000000 0.000000
material    0 0 0x00000566 500
rendertypes 6 0x00000392 0x00000394 0x00000396 0x00000399 0x0000039b 0x0000039d

damage 1000

eof


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

bounds - буквально, границы объекта, достаточно абстрактные величины, советую просто поэкспериментировать с их значениями;

body - это физический каркас объекта, т.е. его форма и очертания, они нужны для того, чтобы обеспечить физическое взаимодествие с объектом (например, столкновение). Координатами задан центр тяжести, обычно он близок к нулю и соответствует кооринатам pivot (виртуальный центр рендера). Далее следует число 100 - это значение массы, вы можете его менять. Сеть SCX это и есть сам физический каркас, его не нужно указывать в RPK, достаточно просто прописать путь к нему в этом файле CFG. ВАЖНО: при экспорте сети SCX для физического каркаса необходимо нажать на флажок Physics в окошке экспорта плагина Invictus SCX Export, в противном случае игра может вылететь на рабочий стол в процессе использования этого файла.

render - основной рендер объекта (его визуальное представление), в нашем примере это 0x00000438, что соответствует следующей метке в objects.rdb:

Цитата

typeof    14
superid    0x0000005C
typeid    0x00000438
alias    tabla_b
isparentcompatible    1.00


mesh 0x00000145
lod_amp 20.000
texture 0x0002014A


После id рендера указаны его координаты XYZ и YPR, вы можете их удалить.

rendertypes - дополнительные рендеры, которые появляются в случайном порядке поверх основного. Число 6 это количество рендеров, а дальше идёт перечисление всех их typeid;

material - typeid звука столкновения с объектом и уровень его громкости. Ниже указано, как создавать такой typeid:



damage - прочность объекта, обычно указывается значение 1000;

eof - ключевое слово, означающее окончание файла CFG.

После того, как вы изучили то, как устроен файл CFG объекта, вы можете создать свой собственный объект, руководствуясь следующей простой инструкцией:

1. Создать файл .rdb, в котором будут описаны ваши объекты. Файл можете поместить в любую папку игры;
2. Создать в этом файле метку, описывающую путь к файлу CFG, формат метки выглядит так:

Код
<FILE 00000172.res >
typeof    8
superid    0x000000C2
typeid    0x00000172
alias    tabla_b
isparentcompatible    1.00
</FILE>
<FILE 00000172.rsd >
native object objects\scripts\tabla_b.cfg
</FILE>


3. Экспортировать модель объекта в формат SCX как обычный рендер;
4. Эскпортировать ту же модель, но с флагом Physics, а имя файла начать с префикса "_phys_" (например _phys_treeObject.scx);
5. Добавить в файл .rdb метку, которая описывает файл, экспортированный в пункте 4 (т.е. саму модель);
6. Добавить в этот же файл метку с указанием рендера этой модели (формат метки показан выше на примере typeid 0x00000438);
7. По необходимости добавить в файл .rdb звук столкновения с объектом;
8. Создать файл CFG, указанный в пункте 2, и внести в него соответствующие изменения;
9. Конвертировать файл .rdb в файл RPK с помощью resconvert;
10. Добавить процедуру размещения объекта на карте в файл Java;
11. Протестировать новый объект в игре.

Если не получается создать новый объект, меняйте tabla_b.cfg, который я описывал в примере.

ВНИМАНИЕ! обязательно распакуйте 3 папки из архива objects.rar (исходники объектов) в папку objects, в противном случае стандартные объекты игры не появятся на карте.

Приложения к туториалу:
1. Полная версия файла objects.rdb, нигде вы его больше не найдёте, кроме как здесь;
2. Исходники объектов в архиве objects.rar, тоже уникальный материал;
3. Исходник файла City.java для версии 2.3.0LE, чтобы вы могли добавлять свои объекты в город;
4. Сам файл tabla_b.cfg, очищенный от лишнего мусора и комментариев на венгерском.

Все приложения объединены в один архив attach.rar.

Дополнения:

18.08.2011: Если вы не хотите заморачиваться с выравниванием объектов относительно поверхности, на которой они стоят, вы можете буквально "подбросить" их, после чего они сами примут нужное положение. Для этого вам нужно применить к объекту метод setState, описание которого представлено ниже:

Цитата
//1. Декларируем наш объект в классе трека (допустим, в TestTrack.java)
GameType gt;

//2. Дальше следует стандартная процедура создания объекта. В моём примере это конус, имеющий координаты X-1577.392 Z-294.486 Y-1329.904 и вращение Y-1.303 P-0.003 R0.000
gt = new GameType();
gt.create_native( map, new GameRef(objects:0x00000546r), "0,0,0,0,0,0", "test_object" );
gt.setMatrix( new Vector3(-1577.392,-294.486,-1329.904), new Ypr(-1.303,-0.003,0.000) );

//3. Затем применяем к объекту метод setState()
gt.setState(new Vector3(-1577.392,-293.486,-1329.904), new Ypr(-1.303,-0.003,0.000), new Vector3(0,1,0), new Vector3(1,0,0));

//У этого метода 4 основных параметра:
//1. XYZ координата объекта, с которой начинается воздействие на него;
//2. YPR вращение координаты XYZ;
//3. Дельта-вектор, определяющий траекторию движения объекта под воздействием направленных на него сил;
//4. Тройной вектор, описывающий дополнительные силы, воздействующие на объект по осям X, Y и Z.


Этот метод может быть применён не только на GameType, но и на любые другие объекты, принадлежащие классу GameRef. Он также может быть использован для создания абсолютного хаоса в игре. Экспериментируйте! smile
Прикреплено\Attachment: 7679133.jpg (94.9 Kb) · 6149290.jpg (157.6 Kb) · 0618992.jpg (262.0 Kb) · 8689202.jpg (80.3 Kb)


Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
GTR-X-ITEДата: Суббота, 2011-04-16, 19:33:29 | Номер сообщения: 2
Ранг пользователя
Группа: Administrator
Сообщений: 2463

Награды: 60

Положение: Offline

RAXAT, Спасибо тебе большое за туториал!!! сегодня постараюсь научится как это делается happy еще не хватает урока по добавлению освещения фонаря на карте и будет просто шикарно!!!
 
TariellДата: Суббота, 2011-04-16, 19:48:23 | Номер сообщения: 3
Crazy ass mo-fo
Группа: Trusted Member
Сообщений: 424

Награды: 3

Положение: Offline

полностью согласен с GTR-X-ITE, . Огромное спасибо!!!

 
STANOK83Дата: Суббота, 2011-04-16, 20:23:25 | Номер сообщения: 4
ЧЕЛОВЕК-СТАНОК
Группа: Trusted Member
Сообщений: 590

Награды: 3

Положение: Offline

RAXAT респект и уважуха
 
newrusДата: Суббота, 2011-04-16, 21:04:59 | Номер сообщения: 5
Site Member
Группа: Site Member
Сообщений: 73

Награды: 0

Положение: Offline

МОЛОДЦА!!! Респектище!!!! премного благодарен!!!!
Буду пробывать!!!!!


 
Death_incДата: Воскресенье, 2011-04-17, 02:56:50 | Номер сообщения: 6
человек-пароход
Группа: Site Member
Сообщений: 69

Награды: 1

Положение: Offline

Суппер!!! Да вот освещение бы правда не помешало)) biggrin


http://bloodbc-3d-labs.blogspot.com/
 
newrusДата: Воскресенье, 2011-04-17, 13:57:20 | Номер сообщения: 7
Site Member
Группа: Site Member
Сообщений: 73

Награды: 0

Положение: Offline

RAXAT, Чтот не уловил, где прописываются координаты для размещения в определенном месте на карте...

 
SnakeRДата: Воскресенье, 2011-04-17, 14:13:23 | Номер сообщения: 8
Game Developer
Группа: Forum Moderator
Сообщений: 1508

Награды: 8

Положение: Offline

newrus,

Quote (Raxat)
Quote

gt = new GameType();
gt.create_native( map, new GameRef(objects:0x00000172r), "0,0,0,0,0,0", "test_object" );
gt.setMatrix( new Vector3(-1577.392,-294.486,-1329.904), new Ypr(-1.303,-0.003,0.000) );

Красным цветом обозначен typeid нашего объекта, мы искали его в первом действии. Синим цветом указаны его параметры, не меняйте их. Пурпурным цветом выделено название объекта - называйте его как угодно, название используется только для отладки. Метод new Vector3 определяет координаты объекта в плоскостях X,Y и Z, а метод new Ypr задаёт углы его вращения в радианах по позициями Yaw, Pitch и Roll (YPR), которые соответствуют вращению по одной из трёх возможных осей. Вы сами задаёте эти два параметра в зависимости от карты, которую вы редактируете.

 
GTR-X-ITEДата: Воскресенье, 2011-04-17, 14:32:48 | Номер сообщения: 9
Ранг пользователя
Группа: Administrator
Сообщений: 2463

Награды: 60

Положение: Offline

ЕхуУуу biggrin спасибо за мего туториал!!! все получилось! осталось научится свои объекты добавялть.

 
RAXATДата: Воскресенье, 2011-04-17, 14:55:21 | Номер сообщения: 10
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

newrus, в яве трека, т.е. в файле с расширением .java, в котором он вызывается через объект map, допустим если там есть что-то типа
Quote
map = new GroundRef( maps.test_track:0x00000001r );

Качаем обновлённый архив attach.rar и распаковываем содержимое из архива objects.rar в папку objects smile тогда объекты точно должны появиться в игре (сам архив внутри аттача)


Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
jon555Дата: Понедельник, 2011-04-18, 01:19:19 | Номер сообщения: 11
Группа: Удаленные









RAXAT, спасибо,хороший урок smile
 
RAXATДата: Понедельник, 2011-04-18, 01:22:45 | Номер сообщения: 12
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

Рад стараться smile давно его уже надо было сюда добавить

Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
newrusДата: Вторник, 2011-04-26, 23:13:01 | Номер сообщения: 13
Site Member
Группа: Site Member
Сообщений: 73

Награды: 0

Положение: Offline

SnakeR, Упс, точно.... пропустил... Пасиб...
RAXAT, Да-да-да!!! Давно над было!!! ))))

Добавлено (2011-04-26, 23:13:01)
---------------------------------------------
RAXAT, вопрос!!! Можно ли хоть как то отслеживать по координатам перемещение авто по карте города????
А то получается, чтобы попасть в нужное место для установки объекта на карте, достаточно удаленного от точки входа авто, нужно фактически подгонять координаты, что в свою очередь отнимает ооочень много времени!!!


 
Francocosta02Дата: Среда, 2011-04-27, 03:08:26 | Номер сообщения: 14
Группа: Удаленные









Just awesome... i knew how to do this via RPK file, didn't know that it could be made in the java

//Franco - from GOM

Post edited by Francocosta02 - Среда, 2011-04-27, 03:09:01
 
diegorborgesДата: Среда, 2011-04-27, 04:45:59 | Номер сообщения: 15
Группа: Удаленные









Thanks a lot for the great tutorial RAXAT! I knew how to add via RPK too, same method as Franco knows, but its nice to see that its possible to do from java too!

diegorborges - from GOM

 
REDLINE_RACERДата: Понедельник, 2011-05-02, 13:18:39 | Номер сообщения: 16
Starting Member
Группа: Site Member
Сообщений: 38

Награды: 0

Положение: Offline

do i have permission to put this in the Tutorial section of GOM-TEAM? its some really good help biggrin

- Redline_Racer from gom biggrin


Creator of Redline Patch 2.2.2
Sound Previews
http://www.youtube.com/watch?v=UNzN1Oun_UA
http://www.youtube.com/watch?v=3Ni6ZgxMhFk
http://www.youtube.com/watch?v=vg9ifQfXkig


Post edited by REDLINE_RACER - Понедельник, 2011-05-02, 13:22:16
 
RAXATДата: Понедельник, 2011-05-02, 13:40:18 | Номер сообщения: 17
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

REDLINE_RACER, you can add this to GOM smile it's no problem man

Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
yarik_ua13Дата: Пятница, 2011-05-06, 20:03:20 | Номер сообщения: 18
n00bie
Группа: Registered User
Сообщений: 14

Награды: 0

Положение: Offline

круто ,а вот такой вопросик, можно ли (и коим образом) ставить на карте припаркованые машины, типа трафик(к примеру такси).??

на сайте с 2009ого, и тока щас начал на форуме писать :s
 
newrusДата: Пятница, 2011-05-06, 22:53:56 | Номер сообщения: 19
Site Member
Группа: Site Member
Сообщений: 73

Награды: 0

Положение: Offline

yarik_ua13, а ничего не меняется... принцип тот же... главное координаты прописать....

 
yarik_ua13Дата: Суббота, 2011-05-07, 01:54:26 | Номер сообщения: 20
n00bie
Группа: Registered User
Сообщений: 14

Награды: 0

Положение: Offline

надеюсь прокатит, т.к. у машины, в отличие от мусорки, есть намёк на разум biggrin , гланое шоб не уехала happy
и спасибо


на сайте с 2009ого, и тока щас начал на форуме писать :s
 
GTR-X-ITEДата: Среда, 2011-08-17, 20:05:28 | Номер сообщения: 21
Ранг пользователя
Группа: Administrator
Сообщений: 2463

Награды: 60

Положение: Offline

Quote (RAXAT)
5. Добавить в файл .rdb метку, которая описывает файл, экспортированный в пункте 4 (т.е. саму модель);


в рдб объектов вообще нет ни одного блока напоминающие о phys wacko
 
RazeilДата: Среда, 2011-08-17, 22:30:47 | Номер сообщения: 22
Crazy ass mo-fo
Группа: Trusted Member
Сообщений: 499

Награды: 4

Положение: Offline

GTR-X-ITE, возможно её просто прописуешь в своём cfg и всё! а в rpk не нужно! попробуй так!

Уважаю SLRR
 
GTR-X-ITEДата: Четверг, 2011-08-18, 00:14:04 | Номер сообщения: 23
Ранг пользователя
Группа: Administrator
Сообщений: 2463

Награды: 60

Положение: Offline

Razeil, я так и понял.

свой объект добавил в игру,правда нет на нем физмеши по непонятной причине. машина сквозь него проходит. еще раз попробую
 
RazeilДата: Четверг, 2011-08-18, 08:39:36 | Номер сообщения: 24
Crazy ass mo-fo
Группа: Trusted Member
Сообщений: 499

Награды: 4

Положение: Offline

GTR-X-ITE, там не все обьекты имеют физмеши а делать скорее всего нужно по примерам с физмешами!
я тоже пробую но только стандартные обьекты получается!


Уважаю SLRR
 
RAXATДата: Четверг, 2011-08-18, 12:44:45 | Номер сообщения: 25
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

Читаем обновление в шапке темы! smile

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



Прикреплено\Attachment: 1269727.jpg (195.2 Kb) · 8153882.jpg (444.9 Kb)


Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
RAXATДата: Четверг, 2011-08-18, 13:21:50 | Номер сообщения: 26
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

Применил метод на свалке у Джо smile







Прикреплено\Attachment: 4096254.jpg (196.0 Kb) · 5131776.jpg (122.1 Kb) · 8994613.jpg (100.5 Kb) · 4294129.jpg (120.6 Kb)


Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
RazeilДата: Четверг, 2011-08-18, 13:23:03 | Номер сообщения: 27
Crazy ass mo-fo
Группа: Trusted Member
Сообщений: 499

Награды: 4

Положение: Offline

да уж круто! biggrin

Уважаю SLRR
 
mAd_mAnДата: Четверг, 2011-08-18, 15:29:10 | Номер сообщения: 28
АЦЦКИЙ КАНДУКТАР
Группа: Forum Moderator
Сообщений: 651

Награды: 4

Положение: Offline

RAXAT, это прототип/финал реализации битых машин в 2.3.1 как ты говорил давно? Или для лулзов?

Если для реализации, то (на всякий случай) слишком уж тачки битые.. Такие обычно в утиль, а не на продажу и восстановление! =)))



Автомобиль не роскошь!
Роскошь - средства на его передвижение! ©
"На каждое ИМХО всегда найдётся свой удар ломом по ебл?щу!" © mAd_mAn
 
RAXATДата: Четверг, 2011-08-18, 16:33:14 | Номер сообщения: 29
Legend
Группа: Master
Сообщений: 5209

Награды: 82

Положение: Offline

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

Владелец сайта PROMODS.RU
Администратор сайта streetlegalmods.com (GOM-TEAM)
Разработчик Street Legal Racing: Redline v2.3.1
Skype: skype_raxat
PayPal: eversoft@bk.ru
E-mail: ceo@image-code.com
 
mAd_mAnДата: Пятница, 2011-08-19, 09:42:24 | Номер сообщения: 30
АЦЦКИЙ КАНДУКТАР
Группа: Forum Moderator
Сообщений: 651

Награды: 4

Положение: Offline

RAXAT, ты кстати ещё для лулзов обещал "banhammer" room сделать! =) В смысле комнатку с молотком, чтоб тачки ручками коццать.. Будет или отказался?


Автомобиль не роскошь!
Роскошь - средства на его передвижение! ©
"На каждое ИМХО всегда найдётся свой удар ломом по ебл?щу!" © mAd_mAn
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Copyright PRO Mods 2005© All rights reserved