Анонс модификаций

Информация по разработке, отладке режима и др.
Ответить
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

KeNNy писал(а):
Eakwarp писал(а):
NoRemorse писал(а):/att (добовление объектов к персонажу) добавят сразу с инвентарем? Думаю стоить включить в анонс.
А кто вам сказал, что будет какой-то там /att? Навыдумывали себе.
А почему нет? было бы отлично это увидеть с новым инвентарем.

С новой тюрьмой придет новая организация тюремщиков или этим будет заниматься полиция?
И полиция, и тюремщики, полиция будет доставлять заключенных в тюрьму, а вот уже в ней, заключенные будут проблемой тюремщиков.
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

Hirano писал(а):Когда примерно ожидание выхода нового инвентаря для всех игроков?
Пока не знаю, нет свободного времени. Изначально в любом случае будет ввод тюрьмы.
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
Аватара пользователя
Ribelanto
Писатель
Сообщения: 957
Зарегистрирован: 09 авг 2010, 13:01
Репутация: -9
Ник в игре: Enzo
Откуда: Оттуда.

Re: Анонс модификаций

Сообщение Ribelanto »

Eakwarp писал(а):
MaesTro писал(а):В старом анонсе была "Переделка бизнессов под крыло мин фину", это забылось или просто нет в списке ?
Скажем так, переделка бизнессов будет вообще глобальная, но я пока все не обдумал, поэтому не внес ее в список.
Давай я создам тему и мы всей толпой подумаем над всей экономикой и бизами в частности? Такой коллективный разум поработает и я постепенно сведу всё во едино и получится... не знаю что получится, но, возможно, какая-то экономическая модель. Только такая, чтобы не рубить старую, а модернизировать её с помощью нано-технологий.))
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

Ribelanto писал(а):
Eakwarp писал(а):
MaesTro писал(а):В старом анонсе была "Переделка бизнессов под крыло мин фину", это забылось или просто нет в списке ?
Скажем так, переделка бизнессов будет вообще глобальная, но я пока все не обдумал, поэтому не внес ее в список.
Давай я создам тему и мы всей толпой подумаем над всей экономикой и бизами в частности? Такой коллективный разум поработает и я постепенно сведу всё во едино и получится... не знаю что получится, но, возможно, какая-то экономическая модель. Только такая, чтобы не рубить старую, а модернизировать её с помощью нано-технологий.))
Все гораздо проще и уже придумано, и на 70% продумано, только старая, она как подстреленный мамонт, лохматая, с бивнями и на костылях. В планах развивать малый бизнес, дать возможность реальной конкуренции, создать нормальный товарооборот. Например, мобильных операторов, будет несколько, каждый, будет в состоянии продавать телефоны(номера), и устанавливать вышки, для расширения зоны покрытия(кто играл на тракере[см. http://trucker.valakas.ru ], видел как там фишка с сигналом телефона была реализована). Вместо глобального 24/7 - будет туча мелких магазинов, хозяева которых будут ответственны за ассортимент. Каждый владелец бизнеса, сможет нанять персонал(планируется ограничение на 3 игрока, не считая владельца), например официантку в кафе, или продавца в салон связи. Товарооборот не будет ограничен одним выпускаемым и одним потребляемым продуктом, товар не будет тупо выпускаться каждый час, а нужно будет реально работать, перерабатывая одни продукты в другие, грузовики можно будет грузить разными типами продуктов одновременно. И так далее, идей масса, часть даже конкретизировал, но на все это у меня банально не хватает времени, а половину из этого, задерживает ввод нового инвентаря, который будет, надо заметить, большой частью всего этого.
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
Аватара пользователя
NoRemorse
Форумчанин
Сообщения: 421
Зарегистрирован: 18 апр 2012, 15:24
Репутация: 40
Ник в игре: Bobby

Re: Анонс модификаций

Сообщение NoRemorse »

Да новая экономическая модель нужна, и должна она переплитатся с роле плеем, пример:
Завод по изготовлению авто запчастей - доставка автокоминатом - магазин - доставка автокомбинатом - СТО Блек Энджелс, это можно всё сделать без технических фич, например каждую неделю лидер СТО должен будет отиграть закупку, и отиграть каждое звено в этой цепи.
Аватара пользователя
Ribelanto
Писатель
Сообщения: 957
Зарегистрирован: 09 авг 2010, 13:01
Репутация: -9
Ник в игре: Enzo
Откуда: Оттуда.

Re: Анонс модификаций

Сообщение Ribelanto »

Eakwarp писал(а):
Ribelanto писал(а):
Eakwarp писал(а):
MaesTro писал(а):В старом анонсе была "Переделка бизнессов под крыло мин фину", это забылось или просто нет в списке ?
Скажем так, переделка бизнессов будет вообще глобальная, но я пока все не обдумал, поэтому не внес ее в список.
Давай я создам тему и мы всей толпой подумаем над всей экономикой и бизами в частности? Такой коллективный разум поработает и я постепенно сведу всё во едино и получится... не знаю что получится, но, возможно, какая-то экономическая модель. Только такая, чтобы не рубить старую, а модернизировать её с помощью нано-технологий.))
Все гораздо проще и уже придумано, и на 70% продумано, только старая, она как подстреленный мамонт, лохматая, с бивнями и на костылях. В планах развивать малый бизнес, дать возможность реальной конкуренции, создать нормальный товарооборот. Например, мобильных операторов, будет несколько, каждый, будет в состоянии продавать телефоны(номера), и устанавливать вышки, для расширения зоны покрытия(кто играл на тракере[см. http://trucker.valakas.ru ], видел как там фишка с сигналом телефона была реализована). Вместо глобального 24/7 - будет туча мелких магазинов, хозяева которых будут ответственны за ассортимент. Каждый владелец бизнеса, сможет нанять персонал(планируется ограничение на 3 игрока, не считая владельца), например официантку в кафе, или продавца в салон связи. Товарооборот не будет ограничен одним выпускаемым и одним потребляемым продуктом, товар не будет тупо выпускаться каждый час, а нужно будет реально работать, перерабатывая одни продукты в другие, грузовики можно будет грузить разными типами продуктов одновременно. И так далее, идей масса, часть даже конкретизировал, но на все это у меня банально не хватает времени, а половину из этого, задерживает ввод нового инвентаря, который будет, надо заметить, большой частью всего этого.
Я не совсем про это. Но и про это тоже.)) Я и предлагаю сделать тему такую, где постепенно по каждому бизнесу всё будет расписано. Откуда и куда всё везётся, откуда берётся и так далее. Вообще описание всего, что связано с деньгами - от наркоты и оружия до доставки цистерны с бензином на конкретную заправку. Вывоз мусора... и прочее, и прочее, и прочее.
В идеале получится одновременно и гайд по бизам и экономике.
Игроки постоянно заваливают идеями и всё идеи по экономике будут в одной теме.
Опять же, в идеале, тебе потом придётся просто технически реализовать то, что будет в первом посте. Не додумывая, не придумывая.
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

Проблема в свободном времени на реализацию, повторюсь, сейчас, я один занимаюсь технической частью сервера(уцп - Алекс), у меня просто физически не хватает времени и сил делать все это. Даже если тема будет, даже если будет поэтапный план разработки, я понятия не имею, когда мы все это сможем осуществить.
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
РэK0zyavkka
Форумчанин
Сообщения: 420
Зарегистрирован: 18 апр 2012, 17:08
Репутация: -1
Ник в игре: Cody Cullen

Re: Анонс модификаций

Сообщение РэK0zyavkka »

Eakwarp писал(а):Проблема в свободном времени на реализацию, повторюсь, сейчас, я один занимаюсь технической частью сервера(уцп - Алекс), у меня просто физически не хватает времени и сил делать все это. Даже если тема будет, даже если будет поэтапный план разработки, я понятия не имею, когда мы все это сможем осуществить.
Взять помощников,не?)
Изображение
Кому нужен,звоните :D
test  Cody Cullen
Справка о состоянии здоровья

Фамилия, Имя пациента: Коди Каллен
Возраст: 30
Пол: Мужской
Состояние здоровья: Отличное
Противопоказания: Не имеется

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Здоров

Врач: Никита Феррум.
Подпись: Ferrum0k
test  Jasper Kyd
PavelMas писал(а):
Справка о состоянии здоровья

Фамилия, Имя пациента: Jasper Kyd
Возраст: 32 года
Пол: Мужской
Состояние здоровья: Полностью здоров
Противопоказания: Не имеются

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Полностью здоров

Врач: Pavel Maslennikov
Подпись: Maslennikov
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

РэK0zyavkka писал(а):
Eakwarp писал(а):Проблема в свободном времени на реализацию, повторюсь, сейчас, я один занимаюсь технической частью сервера(уцп - Алекс), у меня просто физически не хватает времени и сил делать все это. Даже если тема будет, даже если будет поэтапный план разработки, я понятия не имею, когда мы все это сможем осуществить.
Взять помощников,не?)
Весело звучит. К сожалению, во всей сфере наберется от силы 7 людей, обладающих подходящими знаниями и навыками, для работы над валакасом в текущем его виде. Из этих 7, я никому не доверяю, 5 из них занимается своими проектами, все 7, за спасибо(как это делаю я) работать естественно не будут. А "пускать козла в огород" или учить кого либо, тратя на него свое время, я не собираюсь.
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
РэK0zyavkka
Форумчанин
Сообщения: 420
Зарегистрирован: 18 апр 2012, 17:08
Репутация: -1
Ник в игре: Cody Cullen

Re: Анонс модификаций

Сообщение РэK0zyavkka »

Eakwarp писал(а):
РэK0zyavkka писал(а):
Eakwarp писал(а):Проблема в свободном времени на реализацию, повторюсь, сейчас, я один занимаюсь технической частью сервера(уцп - Алекс), у меня просто физически не хватает времени и сил делать все это. Даже если тема будет, даже если будет поэтапный план разработки, я понятия не имею, когда мы все это сможем осуществить.
Взять помощников,не?)
Весело звучит. К сожалению, во всей сфере наберется от силы 7 людей, обладающих подходящими знаниями и навыками, для работы над валакасом в текущем его виде. Из этих 7, я никому не доверяю, 5 из них занимается своими проектами, все 7, за спасибо(как это делаю я) работать естественно не будут. А "пускать козла в огород" или учить кого либо, тратя на него свое время, я не собираюсь.
Допустим я не много,но что то понимаю в павно,допустимисмогу сделать диалог с ботом. А так же я и за спасибо б поработал. Согласен я б тожетне доверял.
Изображение
Кому нужен,звоните :D
test  Cody Cullen
Справка о состоянии здоровья

Фамилия, Имя пациента: Коди Каллен
Возраст: 30
Пол: Мужской
Состояние здоровья: Отличное
Противопоказания: Не имеется

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Здоров

Врач: Никита Феррум.
Подпись: Ferrum0k
test  Jasper Kyd
PavelMas писал(а):
Справка о состоянии здоровья

Фамилия, Имя пациента: Jasper Kyd
Возраст: 32 года
Пол: Мужской
Состояние здоровья: Полностью здоров
Противопоказания: Не имеются

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Полностью здоров

Врач: Pavel Maslennikov
Подпись: Maslennikov
Аватара пользователя
Hirano
Форумчанин
Сообщения: 306
Зарегистрирован: 19 апр 2012, 02:15
Репутация: -1
Ник в игре: Konstantin_Krestov
Откуда: г.Мечты
Контактная информация:

Re: Анонс модификаций

Сообщение Hirano »

Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
test  
Чем ниже интеллект, тем громче оскорбления.
Сто друзей - свидетельство добродушия...
Сто врагов - свидетельство успеха...
[/i]
Изображение
2 cолдата из строй бата заменяют экскаватор , а солдат из ПВО заменяет хоть кого

Регистрация: 10.09.2009
Здесь была ini.
РэK0zyavkka
Форумчанин
Сообщения: 420
Зарегистрирован: 18 апр 2012, 17:08
Репутация: -1
Ник в игре: Cody Cullen

Re: Анонс модификаций

Сообщение РэK0zyavkka »

Hirano писал(а):Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
Согласен,пускай они тебе скрипт скидывают ты проверишь и все. Это конечно для тех.кто за спасибо готов.
Изображение
Кому нужен,звоните :D
test  Cody Cullen
Справка о состоянии здоровья

Фамилия, Имя пациента: Коди Каллен
Возраст: 30
Пол: Мужской
Состояние здоровья: Отличное
Противопоказания: Не имеется

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Здоров

Врач: Никита Феррум.
Подпись: Ferrum0k
test  Jasper Kyd
PavelMas писал(а):
Справка о состоянии здоровья

Фамилия, Имя пациента: Jasper Kyd
Возраст: 32 года
Пол: Мужской
Состояние здоровья: Полностью здоров
Противопоказания: Не имеются

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Полностью здоров

Врач: Pavel Maslennikov
Подпись: Maslennikov
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

Hirano писал(а):Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
Я итак знаю всех людей, которые обладают достаточными навыками, среди постоянных игроков таковых нет.

Давайте так, вот вам допотопная система квестов валакаса, из нее намеренно убраны все комментарии, образца 2-х летней давности. Задача минимум, описать что и за что отвечает, как работает, с чем связано, какие имеет ограничения, найти все ошибки, досконально. Готовый текст - мне в личку, кто реально покажет знания, будем думать, что делать с вами дальше.
test  Ахтунг, 600 строк кода

Код: Выделить всё

enum squestinfo
{
	sqValid,
	sqStartUserID,
	sqQuestID,
	sqNpcID,
	sqNpcName[MAX_PLAYER_NAME],
	sqNpcSkinID,
	Float:sqNpcX,
	Float:sqNpcY,
	Float:sqNpcZ,
	Float:sqNpcRot,
	sqPrice,
	sqStartItem,// 0/1
	sqStartItemID,
	sqSteeps,
	sqName[64],
	sqText[2048],
	sqAnimUse,
	sqAnimLib[32],
	sqAnimName[32],
	sqRewardItem,
	sqRewardItemID,
	sqUseCheckpoints
}
new StartQuestInfo[8][squestinfo];
new Text3D:StartQuestLabel[sizeof(StartQuestInfo)];

enum metaquestinfo
{
	mqValid,
	mqQuestID,
	mqSteepID,//0-7
	mqNpcID,
	mqNpcName[MAX_PLAYER_NAME],
	mqNpcSkinID,
	Float:mqNpcX,
	Float:mqNpcY,
	Float:mqNpcZ,
	Float:mqNpcRot,
    mqTakeItem,// 0/1
    mqTakeItemID,
   	mqGiveItem,// 0/1
	mqGiveItemID,
	mqEndQuest,// 0/1
	mqText[2048],
	mqAnimUse,
	mqAnimLib[32],
	mqAnimName[32]
}
new MetaQuestInfo[sizeof(StartQuestInfo)][8][metaquestinfo];

new Text3D:MetaQuestLabel[sizeof(StartQuestInfo)][8];

new Quest[MAX_PLAYERS]=-1;//0-9
new Steep[MAX_PLAYERS]=-1;//0-7
stock QuestNPCConnect(p)
{
    new playername[32];
	GetPlayerName(p,playername,32);
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
			if(!strcmp(StartQuestInfo[n][sqNpcName],playername,true))
			{
				StartQuestInfo[n][sqNpcID]=p;
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
				    if(!strcmp(MetaQuestInfo[n][i][mqNpcName],playername,true))
				    {
						MetaQuestInfo[n][i][mqNpcID]=p;
						return 1;
					}
				}
			}
		}
	}
	return 1;
}

stock QuestNPCSetSpawn(p)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
	        if(p==StartQuestInfo[n][sqNpcID])
	        {
	        	SetSpawnInfo(StartQuestInfo[n][sqNpcID], 0, StartQuestInfo[n][sqNpcSkinID],StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ], StartQuestInfo[n][sqNpcRot], 0, 0, 0, 0, 0, 0 );
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
			        if(p==MetaQuestInfo[n][i][mqNpcID])
		        	{
                        SetSpawnInfo(MetaQuestInfo[n][i][mqNpcID], 0,  MetaQuestInfo[n][i][mqNpcSkinID], MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ], MetaQuestInfo[n][i][mqNpcRot], 0, 0, 0, 0, 0, 0 );
						return 1;
		        	}
			    }
			}
		}
	}
	return 1;
}
stock LoadRandomQuests()
{
	new str[255];
    samp_mysql_query("SELECT id FROM quest");
	samp_mysql_store_result();
	new quests=samp_mysql_num_rows();
	if(quests==0)
	{
        print("Error, not quest");
		return 1;
	}
	else if(quests<=sizeof(StartQuestInfo))
	{
	    for(new i = 0; i < quests; i++)
		{
		    if(!LoadQuest(i,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
			#endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
            for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	else
	{
		for(new i = 0; i < sizeof(StartQuestInfo); i++)
		{
		    new bit1,bit2;
		    new rand;
		    while (bit1==1)
			{
	            bit2=0;
			    rand=random(quests);
	            for(new n = 0; n < i; n++)
				{
				    if(StartQuestInfo[n][sqQuestID]==rand)bit2=1;
				}
				if(bit2==0)bit1=1;
			}
		    if(!LoadQuest(rand,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
		    #endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
			for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	return 1;
}

stock LoadQuest(qid,idto)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM quest WHERE id = %d LIMIT 1", qid);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
		StartQuestInfo[idto][sqValid]=1;
		StartQuestInfo[idto][sqQuestID]=qid;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: strmid(StartQuestInfo[idto][sqNpcName], Field, 0, strlen(Field), 255);
		        case 2: StartQuestInfo[idto][sqNpcSkinID] = strval(Field);
				case 3: StartQuestInfo[idto][sqNpcX] = floatstr(Field);
				case 4: StartQuestInfo[idto][sqNpcY] = floatstr(Field);
				case 5: StartQuestInfo[idto][sqNpcZ] = floatstr(Field);
				case 6: StartQuestInfo[idto][sqNpcRot] = floatstr(Field);
				case 7: strmid(StartQuestInfo[idto][sqName], Field, 0, strlen(Field), 255);
				case 8: strmid(StartQuestInfo[idto][sqText], Field, 0, strlen(Field), 2048);
				case 9: StartQuestInfo[idto][sqPrice] = strval(Field);
				case 10: StartQuestInfo[idto][sqStartItem] = strval(Field);
				case 11: StartQuestInfo[idto][sqStartItemID] = strval(Field);
				case 12: StartQuestInfo[idto][sqSteeps] = strval(Field);
				case 13: StartQuestInfo[idto][sqAnimUse] = strval(Field);
				case 14: strmid(StartQuestInfo[idto][sqAnimLib], Field, 0, strlen(Field), 255);
				case 15: strmid(StartQuestInfo[idto][sqAnimName], Field, 0, strlen(Field), 255);
				case 16: StartQuestInfo[idto][sqRewardItem] = strval(Field);
				case 17: StartQuestInfo[idto][sqRewardItemID] = strval(Field);
				case 18: StartQuestInfo[idto][sqUseCheckpoints] = strval(Field);
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, quest %d - not loaded",qid);
	return 0;
}

stock LoadSteep(questid,steep)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM questmeta WHERE QuestID=%d AND SteepID=%d LIMIT 1", questid,steep);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
        MetaQuestInfo[questid][steep][mqValid]=1;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: MetaQuestInfo[questid][steep][mqQuestID]= strval(Field);
		        case 2: MetaQuestInfo[questid][steep][mqSteepID]= strval(Field);
		        case 3: strmid(MetaQuestInfo[questid][steep][mqNpcName], Field, 0, strlen(Field), 255);
		        case 4: MetaQuestInfo[questid][steep][mqNpcSkinID] = strval(Field);
		        case 5: MetaQuestInfo[questid][steep][mqNpcX] = floatstr(Field);
				case 6: MetaQuestInfo[questid][steep][mqNpcY] = floatstr(Field);
				case 7: MetaQuestInfo[questid][steep][mqNpcZ] = floatstr(Field);
				case 8: MetaQuestInfo[questid][steep][mqNpcRot] = floatstr(Field);
				case 9: MetaQuestInfo[questid][steep][mqTakeItem]= strval(Field);
				case 10: MetaQuestInfo[questid][steep][mqTakeItemID]= strval(Field);
				case 11:MetaQuestInfo[questid][steep][mqGiveItem]= strval(Field);
				case 12:MetaQuestInfo[questid][steep][mqGiveItemID]= strval(Field);
				case 13:MetaQuestInfo[questid][steep][mqEndQuest]= strval(Field);
				case 14:strmid(MetaQuestInfo[questid][steep][mqText], Field, 0, strlen(Field), 2048);
				case 15: MetaQuestInfo[questid][steep][mqAnimUse] = strval(Field);
				case 16: strmid(MetaQuestInfo[questid][steep][mqAnimLib], Field, 0, strlen(Field), 255);
				case 17: strmid(MetaQuestInfo[questid][steep][mqAnimName], Field, 0, strlen(Field), 255);
				
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, steep %d for quest %d - not loaded",steep,questid);
	return 0;
}

stock SayToQuestPlayer(playerid)
{
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]))
		{
		    if(Quest[playerid]==-1)//начать квест
			{
			    new query[255];
			    format(query,sizeof(query),"SELECT id FROM questcomplete WHERE Name='%s' AND QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[i][sqQuestID]);
				samp_mysql_query(query);
				samp_mysql_store_result();
				new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				if(samp_mysql_num_rows() != 0)
				{
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				}
				if(IsACop(playerid))return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				Quest[playerid]=i;
			    ShowPlayerDialog(playerid,199,DIALOG_STYLE_MSGBOX,str,StartQuestInfo[i][sqText],"Взять","Не взять");
			    return 1;
		    }
		    else
		    {
		        new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
		        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
		    }
		}
		for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]))
			{
			    if(Quest[playerid]!=i)
			    {
    				new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
			        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
			    if(Steep[playerid]==b)
			    {
					if(MetaQuestInfo[i][b][mqTakeItem])
					{
						if(FindItem(playerid,MetaQuestInfo[i][b][mqTakeItemID])) DeleteOneItem(playerid,MetaQuestInfo[i][b][mqTakeItemID]);
						else EndQuest(playerid,0);
					}
					new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				    ShowPlayerDialog(playerid,200,DIALOG_STYLE_MSGBOX,str,MetaQuestInfo[i][b][mqText],"Ок","Ок");
				    return 1;
			    }
			    else
			    {
			        new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
					return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
		    }
		}
	}
	return 1;
}
stock QuestDialogResponse(playerid, dialogid, response)
{
	switch(dialogid)
	{
	    case 199:
	    {
			if(response)
			{
			    if(StartQuestInfo[Quest[playerid]][sqStartItem])
				{
				    if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqStartItemID],1))
					{
					    new str[255];
						format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
						Quest[playerid]=-1;
						Steep[playerid]=-1;
					    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
					}
			    }
			    Steep[playerid]=0;
			    new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
				{
					SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
			    }
			    return 1;
			}
			else
			{
			    Quest[playerid]=-1;
			}
	    }
		case 200:
		{
		    if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItem])
			{
			    if(!SetItem(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItemID],1))
				{
				    new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqEndQuest]) return EndQuest(playerid, 1);
			new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Steep[playerid]++;
			if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
			{
				SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
			    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
		    }
		    return 1;
		}
	}
	return 1;
}
stock EndQuest(playerid, type)
{
	switch(type)
	{
		case 0://провал
		{
		    new str[255];
		    DisablePlayerCheckpoint(playerid);
		    ClearQuestItems(playerid);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы провалили квест","Ок","Ок");
		}
		case 1://выигрыш
		{
		    new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
		    if(StartQuestInfo[Quest[playerid]][sqRewardItem])
		    {
		        if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqRewardItemID],1))
		        {
		            return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			new str1[255];
			format(str1,sizeof(str1),"Вы прошли квест, награда %d",StartQuestInfo[Quest[playerid]][sqPrice]);
			new reason[255];
			format(reason,sizeof(reason),"Прошел квест %s",StartQuestInfo[Quest[playerid]][sqName]);
			DisablePlayerCheckpoint(playerid);
            TransferMoney(0,0,playerid,1,StartQuestInfo[Quest[playerid]][sqPrice],reason);
            new query[255];
            format(query,sizeof(query),"INSERT INTO questcomplete SET Name='%s', QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[Quest[playerid]][sqQuestID]);
			samp_mysql_query(query);
            Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			ClearQuestItems(playerid);
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,str1,"Ок","Ок");
		}
	}
	return 1;
}
stock QuestPlayerConnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
stock QuestPlayerDisconnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
enum equestinfo
{
	eqType,
	eqStage,
	eqQuest,
    eqText[2048]
};
new EditQuestInfo[MAX_PLAYERS][equestinfo];
stock StartEditTextForQuest(playerid)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ]))
		{
			new str[255];
			format(str,sizeof(str),"Изменение квеста %d, вы сейчас на старте, введите название:",n);
			format(EditQuestInfo[playerid][eqText],2048," ");
			EditQuestInfo[playerid][eqType]=-1;
			EditQuestInfo[playerid][eqQuest]=n;
			ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
			return 1;
		}
		for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ]))
			{
                EditQuestInfo[playerid][eqType]=1;
                EditQuestInfo[playerid][eqQuest]=n;
                EditQuestInfo[playerid][eqStage]=i;
                new str[255];
				format(str,sizeof(str),"Изменение квеста %d, этап %d",n,i);
				format(EditQuestInfo[playerid][eqText],2048," ");
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
				return 1;
			}
		}
	}
	return 0;
}
stock EditQuestDialogResponse(playerid, dialogid, response, inputtext[])
{
	switch(dialogid)
	{
	    case 221:
	    {
	        if(response)
	        {
	            new str[255];
	            switch(EditQuestInfo[playerid][eqType])
	            {
					case -1:
					{
						new query[255];
					    format(query,sizeof(query),"UPDATE quest SET Name=' %s' WHERE id=%d",inputtext,StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqName],64,"%s",inputtext);
						format(str,sizeof(str),"Изменение квеста %d, текст квеста:",EditQuestInfo[playerid][eqQuest]);
						format(EditQuestInfo[playerid][eqText],2048," ");
						EditQuestInfo[playerid][eqType]=0;
						ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
						return 1;
					}
	                case 0:format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					case 1:format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
	            }
				format(EditQuestInfo[playerid][eqText],2048," %s\n%s",EditQuestInfo[playerid][eqText],inputtext);
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
	        }
	        else
	        {
	            new str[255];
	            new query[2048];
	            switch(EditQuestInfo[playerid][eqType])
	            {
	                case 0:
					{
					    format(query,sizeof(query),"UPDATE quest SET QuestText='%s' WHERE id=%d",EditQuestInfo[playerid][eqText],StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					   	format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					}
					case 1:
					{
					    format(query,sizeof(query),"UPDATE questmeta SET QuestText='%s' WHERE QuestID=%d AND SteepID=%d",EditQuestInfo[playerid][eqText],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqQuestID],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqSteepID]);
					    samp_mysql_query(query);
					    format(MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					    format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
					}
	            }
	            ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Сохранено","Ок","Ок");
				return 1;
	        }
	    }
	}
	return 1;
}
stock UnloadQuests()
{
	foreach(Player,i)
	{
	    if(Quest[i]>=0)
		{
	    	new str[255];
		    DisablePlayerCheckpoint(i);
		    ClearQuestItems(i);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[i]][sqName]);
			Quest[i]=-1;//0-9
			Steep[i]=-1;//0-7
			return ShowPlayerDialog(i,0,DIALOG_STYLE_MSGBOX,str,"Квесты были выгружены, и ваше участие отменено","Ок","Ок");
	    }
	}
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
	    if(StartQuestInfo[i][sqValid])
	    {
	        #if defined CBOTS
	    	DestroyNPC(StartQuestInfo[i][sqNpcID]);
	    	#else
			Kick(StartQuestInfo[i][sqNpcID]);
			#endif
            DestroyDynamic3DTextLabel(StartQuestLabel[i]);
            StartQuestInfo[i][sqValid]=0;
	    	for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
	        {
	            if(MetaQuestInfo[i][b][mqValid])
	            {
	                #if defined CBOTS
	            	DestroyNPC(MetaQuestInfo[i][b][mqNpcID]);
	            	#else
					Kick(MetaQuestInfo[i][b][mqNpcID]);
	            	#endif
	            	DestroyDynamic3DTextLabel(MetaQuestLabel[i][b]);
	            	MetaQuestInfo[i][b][mqValid]=0;
	            }
        	}
        }
    }
	return 1;
}
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
РэK0zyavkka
Форумчанин
Сообщения: 420
Зарегистрирован: 18 апр 2012, 17:08
Репутация: -1
Ник в игре: Cody Cullen

Re: Анонс модификаций

Сообщение РэK0zyavkka »

Ммм я знаю чтотза 5 строчкк :D
Изображение
Кому нужен,звоните :D
test  Cody Cullen
Справка о состоянии здоровья

Фамилия, Имя пациента: Коди Каллен
Возраст: 30
Пол: Мужской
Состояние здоровья: Отличное
Противопоказания: Не имеется

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Здоров

Врач: Никита Феррум.
Подпись: Ferrum0k
test  Jasper Kyd
PavelMas писал(а):
Справка о состоянии здоровья

Фамилия, Имя пациента: Jasper Kyd
Возраст: 32 года
Пол: Мужской
Состояние здоровья: Полностью здоров
Противопоказания: Не имеются

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Полностью здоров

Врач: Pavel Maslennikov
Подпись: Maslennikov
Аватара пользователя
Ribelanto
Писатель
Сообщения: 957
Зарегистрирован: 09 авг 2010, 13:01
Репутация: -9
Ник в игре: Enzo
Откуда: Оттуда.

Re: Анонс модификаций

Сообщение Ribelanto »

Eakwarp писал(а):Проблема в свободном времени на реализацию, повторюсь, сейчас, я один занимаюсь технической частью сервера(уцп - Алекс), у меня просто физически не хватает времени и сил делать все это. Даже если тема будет, даже если будет поэтапный план разработки, я понятия не имею, когда мы все это сможем осуществить.
Ну ты же сам говоришь (или намекаешь), что это делать нужно. В любом случае, вся эта новая система с вышками, разными операторами не подойдет для онлайна в 40 человек. И даже для 60. Это всё нужно будет на будущее, когда онлайн дойдёт до 80-100 стабильно. Ведь вы же планируете достигать этого уровня? Даже если на сервере увеличится количество панам, но эти же панамы будут развозить товары, часть из них научится и освоится, часть сгинет под всеобщее улю-люкание.
К тому времени и нужно будет готовиться. Чтобы система уже была. Потихонечку делать. Когда есть чёткий план действий, тогда легче потихонечку всё делать. Выполнил пункт А, начал В.
Некоторую часть этой системы можно и в эту пока внести. Например, сделать вывоз мусора не только из бизов, но из автошколы, полиции... Это даст работу нигерам из гетто. Им не надо будет куда-то во фракцию идти. Поработали - и дальше у себя на районе накуриваются, продают наркоту, стволы...
Подача рекламы и объявления через смс, чтобы два биза взаимодействовали.
Но главное - отношение к игрокам немного поменять. Чтобы не было историй вроде бизов аренды. Либо по РП это можно было сделать, либо заранее предложить варианты другие.
Тут всё взаимосвязано и одно влияет на другое. Если РП-сервер, то должно быть РП. А не околоРП Пафоса.
Аватара пользователя
Hirano
Форумчанин
Сообщения: 306
Зарегистрирован: 19 апр 2012, 02:15
Репутация: -1
Ник в игре: Konstantin_Krestov
Откуда: г.Мечты
Контактная информация:

Re: Анонс модификаций

Сообщение Hirano »

Давай Колчин полный вперёд , для меня так лично это тупо Английский текст
test  
Чем ниже интеллект, тем громче оскорбления.
Сто друзей - свидетельство добродушия...
Сто врагов - свидетельство успеха...
[/i]
Изображение
2 cолдата из строй бата заменяют экскаватор , а солдат из ПВО заменяет хоть кого

Регистрация: 10.09.2009
Здесь была ini.
Аватара пользователя
Hirano
Форумчанин
Сообщения: 306
Зарегистрирован: 19 апр 2012, 02:15
Репутация: -1
Ник в игре: Konstantin_Krestov
Откуда: г.Мечты
Контактная информация:

Re: Анонс модификаций

Сообщение Hirano »

Eakwarp писал(а):
Hirano писал(а):Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
Я итак знаю всех людей, которые обладают достаточными навыками, среди постоянных игроков таковых нет.

Давайте так, вот вам допотопная система квестов валакаса, из нее намеренно убраны все комментарии, образца 2-х летней давности. Задача минимум, описать что и за что отвечает, как работает, с чем связано, какие имеет ограничения, найти все ошибки, досконально. Готовый текст - мне в личку, кто реально покажет знания, будем думать, что делать с вами дальше.
test  Ахтунг, 600 строк кода

Код: Выделить всё

enum squestinfo
{
	sqValid,
	sqStartUserID,
	sqQuestID,
	sqNpcID,
	sqNpcName[MAX_PLAYER_NAME],
	sqNpcSkinID,
	Float:sqNpcX,
	Float:sqNpcY,
	Float:sqNpcZ,
	Float:sqNpcRot,
	sqPrice,
	sqStartItem,// 0/1
	sqStartItemID,
	sqSteeps,
	sqName[64],
	sqText[2048],
	sqAnimUse,
	sqAnimLib[32],
	sqAnimName[32],
	sqRewardItem,
	sqRewardItemID,
	sqUseCheckpoints
}
new StartQuestInfo[8][squestinfo];
new Text3D:StartQuestLabel[sizeof(StartQuestInfo)];

enum metaquestinfo
{
	mqValid,
	mqQuestID,
	mqSteepID,//0-7
	mqNpcID,
	mqNpcName[MAX_PLAYER_NAME],
	mqNpcSkinID,
	Float:mqNpcX,
	Float:mqNpcY,
	Float:mqNpcZ,
	Float:mqNpcRot,
    mqTakeItem,// 0/1
    mqTakeItemID,
   	mqGiveItem,// 0/1
	mqGiveItemID,
	mqEndQuest,// 0/1
	mqText[2048],
	mqAnimUse,
	mqAnimLib[32],
	mqAnimName[32]
}
new MetaQuestInfo[sizeof(StartQuestInfo)][8][metaquestinfo];

new Text3D:MetaQuestLabel[sizeof(StartQuestInfo)][8];

new Quest[MAX_PLAYERS]=-1;//0-9
new Steep[MAX_PLAYERS]=-1;//0-7
stock QuestNPCConnect(p)
{
    new playername[32];
	GetPlayerName(p,playername,32);
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
			if(!strcmp(StartQuestInfo[n][sqNpcName],playername,true))
			{
				StartQuestInfo[n][sqNpcID]=p;
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
				    if(!strcmp(MetaQuestInfo[n][i][mqNpcName],playername,true))
				    {
						MetaQuestInfo[n][i][mqNpcID]=p;
						return 1;
					}
				}
			}
		}
	}
	return 1;
}

stock QuestNPCSetSpawn(p)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
	        if(p==StartQuestInfo[n][sqNpcID])
	        {
	        	SetSpawnInfo(StartQuestInfo[n][sqNpcID], 0, StartQuestInfo[n][sqNpcSkinID],StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ], StartQuestInfo[n][sqNpcRot], 0, 0, 0, 0, 0, 0 );
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
			        if(p==MetaQuestInfo[n][i][mqNpcID])
		        	{
                        SetSpawnInfo(MetaQuestInfo[n][i][mqNpcID], 0,  MetaQuestInfo[n][i][mqNpcSkinID], MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ], MetaQuestInfo[n][i][mqNpcRot], 0, 0, 0, 0, 0, 0 );
						return 1;
		        	}
			    }
			}
		}
	}
	return 1;
}
stock LoadRandomQuests()
{
	new str[255];
    samp_mysql_query("SELECT id FROM quest");
	samp_mysql_store_result();
	new quests=samp_mysql_num_rows();
	if(quests==0)
	{
        print("Error, not quest");
		return 1;
	}
	else if(quests<=sizeof(StartQuestInfo))
	{
	    for(new i = 0; i < quests; i++)
		{
		    if(!LoadQuest(i,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
			#endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
            for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	else
	{
		for(new i = 0; i < sizeof(StartQuestInfo); i++)
		{
		    new bit1,bit2;
		    new rand;
		    while (bit1==1)
			{
	            bit2=0;
			    rand=random(quests);
	            for(new n = 0; n < i; n++)
				{
				    if(StartQuestInfo[n][sqQuestID]==rand)bit2=1;
				}
				if(bit2==0)bit1=1;
			}
		    if(!LoadQuest(rand,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
		    #endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
			for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	return 1;
}

stock LoadQuest(qid,idto)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM quest WHERE id = %d LIMIT 1", qid);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
		StartQuestInfo[idto][sqValid]=1;
		StartQuestInfo[idto][sqQuestID]=qid;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: strmid(StartQuestInfo[idto][sqNpcName], Field, 0, strlen(Field), 255);
		        case 2: StartQuestInfo[idto][sqNpcSkinID] = strval(Field);
				case 3: StartQuestInfo[idto][sqNpcX] = floatstr(Field);
				case 4: StartQuestInfo[idto][sqNpcY] = floatstr(Field);
				case 5: StartQuestInfo[idto][sqNpcZ] = floatstr(Field);
				case 6: StartQuestInfo[idto][sqNpcRot] = floatstr(Field);
				case 7: strmid(StartQuestInfo[idto][sqName], Field, 0, strlen(Field), 255);
				case 8: strmid(StartQuestInfo[idto][sqText], Field, 0, strlen(Field), 2048);
				case 9: StartQuestInfo[idto][sqPrice] = strval(Field);
				case 10: StartQuestInfo[idto][sqStartItem] = strval(Field);
				case 11: StartQuestInfo[idto][sqStartItemID] = strval(Field);
				case 12: StartQuestInfo[idto][sqSteeps] = strval(Field);
				case 13: StartQuestInfo[idto][sqAnimUse] = strval(Field);
				case 14: strmid(StartQuestInfo[idto][sqAnimLib], Field, 0, strlen(Field), 255);
				case 15: strmid(StartQuestInfo[idto][sqAnimName], Field, 0, strlen(Field), 255);
				case 16: StartQuestInfo[idto][sqRewardItem] = strval(Field);
				case 17: StartQuestInfo[idto][sqRewardItemID] = strval(Field);
				case 18: StartQuestInfo[idto][sqUseCheckpoints] = strval(Field);
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, quest %d - not loaded",qid);
	return 0;
}

stock LoadSteep(questid,steep)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM questmeta WHERE QuestID=%d AND SteepID=%d LIMIT 1", questid,steep);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
        MetaQuestInfo[questid][steep][mqValid]=1;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: MetaQuestInfo[questid][steep][mqQuestID]= strval(Field);
		        case 2: MetaQuestInfo[questid][steep][mqSteepID]= strval(Field);
		        case 3: strmid(MetaQuestInfo[questid][steep][mqNpcName], Field, 0, strlen(Field), 255);
		        case 4: MetaQuestInfo[questid][steep][mqNpcSkinID] = strval(Field);
		        case 5: MetaQuestInfo[questid][steep][mqNpcX] = floatstr(Field);
				case 6: MetaQuestInfo[questid][steep][mqNpcY] = floatstr(Field);
				case 7: MetaQuestInfo[questid][steep][mqNpcZ] = floatstr(Field);
				case 8: MetaQuestInfo[questid][steep][mqNpcRot] = floatstr(Field);
				case 9: MetaQuestInfo[questid][steep][mqTakeItem]= strval(Field);
				case 10: MetaQuestInfo[questid][steep][mqTakeItemID]= strval(Field);
				case 11:MetaQuestInfo[questid][steep][mqGiveItem]= strval(Field);
				case 12:MetaQuestInfo[questid][steep][mqGiveItemID]= strval(Field);
				case 13:MetaQuestInfo[questid][steep][mqEndQuest]= strval(Field);
				case 14:strmid(MetaQuestInfo[questid][steep][mqText], Field, 0, strlen(Field), 2048);
				case 15: MetaQuestInfo[questid][steep][mqAnimUse] = strval(Field);
				case 16: strmid(MetaQuestInfo[questid][steep][mqAnimLib], Field, 0, strlen(Field), 255);
				case 17: strmid(MetaQuestInfo[questid][steep][mqAnimName], Field, 0, strlen(Field), 255);
				
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, steep %d for quest %d - not loaded",steep,questid);
	return 0;
}

stock SayToQuestPlayer(playerid)
{
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]))
		{
		    if(Quest[playerid]==-1)//начать квест
			{
			    new query[255];
			    format(query,sizeof(query),"SELECT id FROM questcomplete WHERE Name='%s' AND QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[i][sqQuestID]);
				samp_mysql_query(query);
				samp_mysql_store_result();
				new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				if(samp_mysql_num_rows() != 0)
				{
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				}
				if(IsACop(playerid))return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				Quest[playerid]=i;
			    ShowPlayerDialog(playerid,199,DIALOG_STYLE_MSGBOX,str,StartQuestInfo[i][sqText],"Взять","Не взять");
			    return 1;
		    }
		    else
		    {
		        new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
		        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
		    }
		}
		for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]))
			{
			    if(Quest[playerid]!=i)
			    {
    				new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
			        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
			    if(Steep[playerid]==b)
			    {
					if(MetaQuestInfo[i][b][mqTakeItem])
					{
						if(FindItem(playerid,MetaQuestInfo[i][b][mqTakeItemID])) DeleteOneItem(playerid,MetaQuestInfo[i][b][mqTakeItemID]);
						else EndQuest(playerid,0);
					}
					new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				    ShowPlayerDialog(playerid,200,DIALOG_STYLE_MSGBOX,str,MetaQuestInfo[i][b][mqText],"Ок","Ок");
				    return 1;
			    }
			    else
			    {
			        new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
					return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
		    }
		}
	}
	return 1;
}
stock QuestDialogResponse(playerid, dialogid, response)
{
	switch(dialogid)
	{
	    case 199:
	    {
			if(response)
			{
			    if(StartQuestInfo[Quest[playerid]][sqStartItem])
				{
				    if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqStartItemID],1))
					{
					    new str[255];
						format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
						Quest[playerid]=-1;
						Steep[playerid]=-1;
					    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
					}
			    }
			    Steep[playerid]=0;
			    new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
				{
					SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
			    }
			    return 1;
			}
			else
			{
			    Quest[playerid]=-1;
			}
	    }
		case 200:
		{
		    if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItem])
			{
			    if(!SetItem(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItemID],1))
				{
				    new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqEndQuest]) return EndQuest(playerid, 1);
			new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Steep[playerid]++;
			if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
			{
				SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
			    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
		    }
		    return 1;
		}
	}
	return 1;
}
stock EndQuest(playerid, type)
{
	switch(type)
	{
		case 0://провал
		{
		    new str[255];
		    DisablePlayerCheckpoint(playerid);
		    ClearQuestItems(playerid);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы провалили квест","Ок","Ок");
		}
		case 1://выигрыш
		{
		    new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
		    if(StartQuestInfo[Quest[playerid]][sqRewardItem])
		    {
		        if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqRewardItemID],1))
		        {
		            return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			new str1[255];
			format(str1,sizeof(str1),"Вы прошли квест, награда %d",StartQuestInfo[Quest[playerid]][sqPrice]);
			new reason[255];
			format(reason,sizeof(reason),"Прошел квест %s",StartQuestInfo[Quest[playerid]][sqName]);
			DisablePlayerCheckpoint(playerid);
            TransferMoney(0,0,playerid,1,StartQuestInfo[Quest[playerid]][sqPrice],reason);
            new query[255];
            format(query,sizeof(query),"INSERT INTO questcomplete SET Name='%s', QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[Quest[playerid]][sqQuestID]);
			samp_mysql_query(query);
            Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			ClearQuestItems(playerid);
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,str1,"Ок","Ок");
		}
	}
	return 1;
}
stock QuestPlayerConnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
stock QuestPlayerDisconnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
enum equestinfo
{
	eqType,
	eqStage,
	eqQuest,
    eqText[2048]
};
new EditQuestInfo[MAX_PLAYERS][equestinfo];
stock StartEditTextForQuest(playerid)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ]))
		{
			new str[255];
			format(str,sizeof(str),"Изменение квеста %d, вы сейчас на старте, введите название:",n);
			format(EditQuestInfo[playerid][eqText],2048," ");
			EditQuestInfo[playerid][eqType]=-1;
			EditQuestInfo[playerid][eqQuest]=n;
			ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
			return 1;
		}
		for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ]))
			{
                EditQuestInfo[playerid][eqType]=1;
                EditQuestInfo[playerid][eqQuest]=n;
                EditQuestInfo[playerid][eqStage]=i;
                new str[255];
				format(str,sizeof(str),"Изменение квеста %d, этап %d",n,i);
				format(EditQuestInfo[playerid][eqText],2048," ");
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
				return 1;
			}
		}
	}
	return 0;
}
stock EditQuestDialogResponse(playerid, dialogid, response, inputtext[])
{
	switch(dialogid)
	{
	    case 221:
	    {
	        if(response)
	        {
	            new str[255];
	            switch(EditQuestInfo[playerid][eqType])
	            {
					case -1:
					{
						new query[255];
					    format(query,sizeof(query),"UPDATE quest SET Name=' %s' WHERE id=%d",inputtext,StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqName],64,"%s",inputtext);
						format(str,sizeof(str),"Изменение квеста %d, текст квеста:",EditQuestInfo[playerid][eqQuest]);
						format(EditQuestInfo[playerid][eqText],2048," ");
						EditQuestInfo[playerid][eqType]=0;
						ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
						return 1;
					}
	                case 0:format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					case 1:format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
	            }
				format(EditQuestInfo[playerid][eqText],2048," %s\n%s",EditQuestInfo[playerid][eqText],inputtext);
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
	        }
	        else
	        {
	            new str[255];
	            new query[2048];
	            switch(EditQuestInfo[playerid][eqType])
	            {
	                case 0:
					{
					    format(query,sizeof(query),"UPDATE quest SET QuestText='%s' WHERE id=%d",EditQuestInfo[playerid][eqText],StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					   	format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					}
					case 1:
					{
					    format(query,sizeof(query),"UPDATE questmeta SET QuestText='%s' WHERE QuestID=%d AND SteepID=%d",EditQuestInfo[playerid][eqText],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqQuestID],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqSteepID]);
					    samp_mysql_query(query);
					    format(MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					    format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
					}
	            }
	            ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Сохранено","Ок","Ок");
				return 1;
	        }
	    }
	}
	return 1;
}
stock UnloadQuests()
{
	foreach(Player,i)
	{
	    if(Quest[i]>=0)
		{
	    	new str[255];
		    DisablePlayerCheckpoint(i);
		    ClearQuestItems(i);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[i]][sqName]);
			Quest[i]=-1;//0-9
			Steep[i]=-1;//0-7
			return ShowPlayerDialog(i,0,DIALOG_STYLE_MSGBOX,str,"Квесты были выгружены, и ваше участие отменено","Ок","Ок");
	    }
	}
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
	    if(StartQuestInfo[i][sqValid])
	    {
	        #if defined CBOTS
	    	DestroyNPC(StartQuestInfo[i][sqNpcID]);
	    	#else
			Kick(StartQuestInfo[i][sqNpcID]);
			#endif
            DestroyDynamic3DTextLabel(StartQuestLabel[i]);
            StartQuestInfo[i][sqValid]=0;
	    	for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
	        {
	            if(MetaQuestInfo[i][b][mqValid])
	            {
	                #if defined CBOTS
	            	DestroyNPC(MetaQuestInfo[i][b][mqNpcID]);
	            	#else
					Kick(MetaQuestInfo[i][b][mqNpcID]);
	            	#endif
	            	DestroyDynamic3DTextLabel(MetaQuestLabel[i][b]);
	            	MetaQuestInfo[i][b][mqValid]=0;
	            }
        	}
        }
    }
	return 1;
}
Потом если что скажешь кто нибуждь хотя бы сделал это
test  
Чем ниже интеллект, тем громче оскорбления.
Сто друзей - свидетельство добродушия...
Сто врагов - свидетельство успеха...
[/i]
Изображение
2 cолдата из строй бата заменяют экскаватор , а солдат из ПВО заменяет хоть кого

Регистрация: 10.09.2009
Здесь была ini.
Enr1k
Местный
Сообщения: 284
Зарегистрирован: 30 июл 2010, 17:18
Репутация: 10
Ник в игре: Enrico Ormanni
Контактная информация:

Re: Анонс модификаций

Сообщение Enr1k »

Eakwarp писал(а):
Hirano писал(а):Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
Я итак знаю всех людей, которые обладают достаточными навыками, среди постоянных игроков таковых нет.

Давайте так, вот вам допотопная система квестов валакаса, из нее намеренно убраны все комментарии, образца 2-х летней давности. Задача минимум, описать что и за что отвечает, как работает, с чем связано, какие имеет ограничения, найти все ошибки, досконально. Готовый текст - мне в личку, кто реально покажет знания, будем думать, что делать с вами дальше.
test  Ахтунг, 600 строк кода

Код: Выделить всё

enum squestinfo
{
	sqValid,
	sqStartUserID,
	sqQuestID,
	sqNpcID,
	sqNpcName[MAX_PLAYER_NAME],
	sqNpcSkinID,
	Float:sqNpcX,
	Float:sqNpcY,
	Float:sqNpcZ,
	Float:sqNpcRot,
	sqPrice,
	sqStartItem,// 0/1
	sqStartItemID,
	sqSteeps,
	sqName[64],
	sqText[2048],
	sqAnimUse,
	sqAnimLib[32],
	sqAnimName[32],
	sqRewardItem,
	sqRewardItemID,
	sqUseCheckpoints
}
new StartQuestInfo[8][squestinfo];
new Text3D:StartQuestLabel[sizeof(StartQuestInfo)];

enum metaquestinfo
{
	mqValid,
	mqQuestID,
	mqSteepID,//0-7
	mqNpcID,
	mqNpcName[MAX_PLAYER_NAME],
	mqNpcSkinID,
	Float:mqNpcX,
	Float:mqNpcY,
	Float:mqNpcZ,
	Float:mqNpcRot,
    mqTakeItem,// 0/1
    mqTakeItemID,
   	mqGiveItem,// 0/1
	mqGiveItemID,
	mqEndQuest,// 0/1
	mqText[2048],
	mqAnimUse,
	mqAnimLib[32],
	mqAnimName[32]
}
new MetaQuestInfo[sizeof(StartQuestInfo)][8][metaquestinfo];

new Text3D:MetaQuestLabel[sizeof(StartQuestInfo)][8];

new Quest[MAX_PLAYERS]=-1;//0-9
new Steep[MAX_PLAYERS]=-1;//0-7
stock QuestNPCConnect(p)
{
    new playername[32];
	GetPlayerName(p,playername,32);
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
			if(!strcmp(StartQuestInfo[n][sqNpcName],playername,true))
			{
				StartQuestInfo[n][sqNpcID]=p;
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
				    if(!strcmp(MetaQuestInfo[n][i][mqNpcName],playername,true))
				    {
						MetaQuestInfo[n][i][mqNpcID]=p;
						return 1;
					}
				}
			}
		}
	}
	return 1;
}

stock QuestNPCSetSpawn(p)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
	        if(p==StartQuestInfo[n][sqNpcID])
	        {
	        	SetSpawnInfo(StartQuestInfo[n][sqNpcID], 0, StartQuestInfo[n][sqNpcSkinID],StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ], StartQuestInfo[n][sqNpcRot], 0, 0, 0, 0, 0, 0 );
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
			        if(p==MetaQuestInfo[n][i][mqNpcID])
		        	{
                        SetSpawnInfo(MetaQuestInfo[n][i][mqNpcID], 0,  MetaQuestInfo[n][i][mqNpcSkinID], MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ], MetaQuestInfo[n][i][mqNpcRot], 0, 0, 0, 0, 0, 0 );
						return 1;
		        	}
			    }
			}
		}
	}
	return 1;
}
stock LoadRandomQuests()
{
	new str[255];
    samp_mysql_query("SELECT id FROM quest");
	samp_mysql_store_result();
	new quests=samp_mysql_num_rows();
	if(quests==0)
	{
        print("Error, not quest");
		return 1;
	}
	else if(quests<=sizeof(StartQuestInfo))
	{
	    for(new i = 0; i < quests; i++)
		{
		    if(!LoadQuest(i,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
			#endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
            for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	else
	{
		for(new i = 0; i < sizeof(StartQuestInfo); i++)
		{
		    new bit1,bit2;
		    new rand;
		    while (bit1==1)
			{
	            bit2=0;
			    rand=random(quests);
	            for(new n = 0; n < i; n++)
				{
				    if(StartQuestInfo[n][sqQuestID]==rand)bit2=1;
				}
				if(bit2==0)bit1=1;
			}
		    if(!LoadQuest(rand,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
		    #endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
			for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	return 1;
}

stock LoadQuest(qid,idto)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM quest WHERE id = %d LIMIT 1", qid);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
		StartQuestInfo[idto][sqValid]=1;
		StartQuestInfo[idto][sqQuestID]=qid;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: strmid(StartQuestInfo[idto][sqNpcName], Field, 0, strlen(Field), 255);
		        case 2: StartQuestInfo[idto][sqNpcSkinID] = strval(Field);
				case 3: StartQuestInfo[idto][sqNpcX] = floatstr(Field);
				case 4: StartQuestInfo[idto][sqNpcY] = floatstr(Field);
				case 5: StartQuestInfo[idto][sqNpcZ] = floatstr(Field);
				case 6: StartQuestInfo[idto][sqNpcRot] = floatstr(Field);
				case 7: strmid(StartQuestInfo[idto][sqName], Field, 0, strlen(Field), 255);
				case 8: strmid(StartQuestInfo[idto][sqText], Field, 0, strlen(Field), 2048);
				case 9: StartQuestInfo[idto][sqPrice] = strval(Field);
				case 10: StartQuestInfo[idto][sqStartItem] = strval(Field);
				case 11: StartQuestInfo[idto][sqStartItemID] = strval(Field);
				case 12: StartQuestInfo[idto][sqSteeps] = strval(Field);
				case 13: StartQuestInfo[idto][sqAnimUse] = strval(Field);
				case 14: strmid(StartQuestInfo[idto][sqAnimLib], Field, 0, strlen(Field), 255);
				case 15: strmid(StartQuestInfo[idto][sqAnimName], Field, 0, strlen(Field), 255);
				case 16: StartQuestInfo[idto][sqRewardItem] = strval(Field);
				case 17: StartQuestInfo[idto][sqRewardItemID] = strval(Field);
				case 18: StartQuestInfo[idto][sqUseCheckpoints] = strval(Field);
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, quest %d - not loaded",qid);
	return 0;
}

stock LoadSteep(questid,steep)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM questmeta WHERE QuestID=%d AND SteepID=%d LIMIT 1", questid,steep);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
        MetaQuestInfo[questid][steep][mqValid]=1;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: MetaQuestInfo[questid][steep][mqQuestID]= strval(Field);
		        case 2: MetaQuestInfo[questid][steep][mqSteepID]= strval(Field);
		        case 3: strmid(MetaQuestInfo[questid][steep][mqNpcName], Field, 0, strlen(Field), 255);
		        case 4: MetaQuestInfo[questid][steep][mqNpcSkinID] = strval(Field);
		        case 5: MetaQuestInfo[questid][steep][mqNpcX] = floatstr(Field);
				case 6: MetaQuestInfo[questid][steep][mqNpcY] = floatstr(Field);
				case 7: MetaQuestInfo[questid][steep][mqNpcZ] = floatstr(Field);
				case 8: MetaQuestInfo[questid][steep][mqNpcRot] = floatstr(Field);
				case 9: MetaQuestInfo[questid][steep][mqTakeItem]= strval(Field);
				case 10: MetaQuestInfo[questid][steep][mqTakeItemID]= strval(Field);
				case 11:MetaQuestInfo[questid][steep][mqGiveItem]= strval(Field);
				case 12:MetaQuestInfo[questid][steep][mqGiveItemID]= strval(Field);
				case 13:MetaQuestInfo[questid][steep][mqEndQuest]= strval(Field);
				case 14:strmid(MetaQuestInfo[questid][steep][mqText], Field, 0, strlen(Field), 2048);
				case 15: MetaQuestInfo[questid][steep][mqAnimUse] = strval(Field);
				case 16: strmid(MetaQuestInfo[questid][steep][mqAnimLib], Field, 0, strlen(Field), 255);
				case 17: strmid(MetaQuestInfo[questid][steep][mqAnimName], Field, 0, strlen(Field), 255);
				
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, steep %d for quest %d - not loaded",steep,questid);
	return 0;
}

stock SayToQuestPlayer(playerid)
{
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]))
		{
		    if(Quest[playerid]==-1)//начать квест
			{
			    new query[255];
			    format(query,sizeof(query),"SELECT id FROM questcomplete WHERE Name='%s' AND QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[i][sqQuestID]);
				samp_mysql_query(query);
				samp_mysql_store_result();
				new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				if(samp_mysql_num_rows() != 0)
				{
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				}
				if(IsACop(playerid))return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				Quest[playerid]=i;
			    ShowPlayerDialog(playerid,199,DIALOG_STYLE_MSGBOX,str,StartQuestInfo[i][sqText],"Взять","Не взять");
			    return 1;
		    }
		    else
		    {
		        new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
		        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
		    }
		}
		for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]))
			{
			    if(Quest[playerid]!=i)
			    {
    				new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
			        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
			    if(Steep[playerid]==b)
			    {
					if(MetaQuestInfo[i][b][mqTakeItem])
					{
						if(FindItem(playerid,MetaQuestInfo[i][b][mqTakeItemID])) DeleteOneItem(playerid,MetaQuestInfo[i][b][mqTakeItemID]);
						else EndQuest(playerid,0);
					}
					new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				    ShowPlayerDialog(playerid,200,DIALOG_STYLE_MSGBOX,str,MetaQuestInfo[i][b][mqText],"Ок","Ок");
				    return 1;
			    }
			    else
			    {
			        new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
					return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
		    }
		}
	}
	return 1;
}
stock QuestDialogResponse(playerid, dialogid, response)
{
	switch(dialogid)
	{
	    case 199:
	    {
			if(response)
			{
			    if(StartQuestInfo[Quest[playerid]][sqStartItem])
				{
				    if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqStartItemID],1))
					{
					    new str[255];
						format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
						Quest[playerid]=-1;
						Steep[playerid]=-1;
					    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
					}
			    }
			    Steep[playerid]=0;
			    new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
				{
					SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
			    }
			    return 1;
			}
			else
			{
			    Quest[playerid]=-1;
			}
	    }
		case 200:
		{
		    if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItem])
			{
			    if(!SetItem(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItemID],1))
				{
				    new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqEndQuest]) return EndQuest(playerid, 1);
			new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Steep[playerid]++;
			if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
			{
				SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
			    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
		    }
		    return 1;
		}
	}
	return 1;
}
stock EndQuest(playerid, type)
{
	switch(type)
	{
		case 0://провал
		{
		    new str[255];
		    DisablePlayerCheckpoint(playerid);
		    ClearQuestItems(playerid);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы провалили квест","Ок","Ок");
		}
		case 1://выигрыш
		{
		    new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
		    if(StartQuestInfo[Quest[playerid]][sqRewardItem])
		    {
		        if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqRewardItemID],1))
		        {
		            return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			new str1[255];
			format(str1,sizeof(str1),"Вы прошли квест, награда %d",StartQuestInfo[Quest[playerid]][sqPrice]);
			new reason[255];
			format(reason,sizeof(reason),"Прошел квест %s",StartQuestInfo[Quest[playerid]][sqName]);
			DisablePlayerCheckpoint(playerid);
            TransferMoney(0,0,playerid,1,StartQuestInfo[Quest[playerid]][sqPrice],reason);
            new query[255];
            format(query,sizeof(query),"INSERT INTO questcomplete SET Name='%s', QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[Quest[playerid]][sqQuestID]);
			samp_mysql_query(query);
            Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			ClearQuestItems(playerid);
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,str1,"Ок","Ок");
		}
	}
	return 1;
}
stock QuestPlayerConnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
stock QuestPlayerDisconnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
enum equestinfo
{
	eqType,
	eqStage,
	eqQuest,
    eqText[2048]
};
new EditQuestInfo[MAX_PLAYERS][equestinfo];
stock StartEditTextForQuest(playerid)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ]))
		{
			new str[255];
			format(str,sizeof(str),"Изменение квеста %d, вы сейчас на старте, введите название:",n);
			format(EditQuestInfo[playerid][eqText],2048," ");
			EditQuestInfo[playerid][eqType]=-1;
			EditQuestInfo[playerid][eqQuest]=n;
			ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
			return 1;
		}
		for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ]))
			{
                EditQuestInfo[playerid][eqType]=1;
                EditQuestInfo[playerid][eqQuest]=n;
                EditQuestInfo[playerid][eqStage]=i;
                new str[255];
				format(str,sizeof(str),"Изменение квеста %d, этап %d",n,i);
				format(EditQuestInfo[playerid][eqText],2048," ");
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
				return 1;
			}
		}
	}
	return 0;
}
stock EditQuestDialogResponse(playerid, dialogid, response, inputtext[])
{
	switch(dialogid)
	{
	    case 221:
	    {
	        if(response)
	        {
	            new str[255];
	            switch(EditQuestInfo[playerid][eqType])
	            {
					case -1:
					{
						new query[255];
					    format(query,sizeof(query),"UPDATE quest SET Name=' %s' WHERE id=%d",inputtext,StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqName],64,"%s",inputtext);
						format(str,sizeof(str),"Изменение квеста %d, текст квеста:",EditQuestInfo[playerid][eqQuest]);
						format(EditQuestInfo[playerid][eqText],2048," ");
						EditQuestInfo[playerid][eqType]=0;
						ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
						return 1;
					}
	                case 0:format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					case 1:format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
	            }
				format(EditQuestInfo[playerid][eqText],2048," %s\n%s",EditQuestInfo[playerid][eqText],inputtext);
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
	        }
	        else
	        {
	            new str[255];
	            new query[2048];
	            switch(EditQuestInfo[playerid][eqType])
	            {
	                case 0:
					{
					    format(query,sizeof(query),"UPDATE quest SET QuestText='%s' WHERE id=%d",EditQuestInfo[playerid][eqText],StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					   	format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					}
					case 1:
					{
					    format(query,sizeof(query),"UPDATE questmeta SET QuestText='%s' WHERE QuestID=%d AND SteepID=%d",EditQuestInfo[playerid][eqText],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqQuestID],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqSteepID]);
					    samp_mysql_query(query);
					    format(MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					    format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
					}
	            }
	            ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Сохранено","Ок","Ок");
				return 1;
	        }
	    }
	}
	return 1;
}
stock UnloadQuests()
{
	foreach(Player,i)
	{
	    if(Quest[i]>=0)
		{
	    	new str[255];
		    DisablePlayerCheckpoint(i);
		    ClearQuestItems(i);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[i]][sqName]);
			Quest[i]=-1;//0-9
			Steep[i]=-1;//0-7
			return ShowPlayerDialog(i,0,DIALOG_STYLE_MSGBOX,str,"Квесты были выгружены, и ваше участие отменено","Ок","Ок");
	    }
	}
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
	    if(StartQuestInfo[i][sqValid])
	    {
	        #if defined CBOTS
	    	DestroyNPC(StartQuestInfo[i][sqNpcID]);
	    	#else
			Kick(StartQuestInfo[i][sqNpcID]);
			#endif
            DestroyDynamic3DTextLabel(StartQuestLabel[i]);
            StartQuestInfo[i][sqValid]=0;
	    	for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
	        {
	            if(MetaQuestInfo[i][b][mqValid])
	            {
	                #if defined CBOTS
	            	DestroyNPC(MetaQuestInfo[i][b][mqNpcID]);
	            	#else
					Kick(MetaQuestInfo[i][b][mqNpcID]);
	            	#endif
	            	DestroyDynamic3DTextLabel(MetaQuestLabel[i][b]);
	            	MetaQuestInfo[i][b][mqValid]=0;
	            }
        	}
        }
    }
	return 1;
}
Что-то не вижу я в том коде ошибок. Скомпилировалось по крайней мере без запинок)
Тут была говнореклама, убрал нахер © DiZet
Аватара пользователя
Eakwarp
Команда проекта
Сообщения: 7864
Зарегистрирован: 29 июл 2010, 22:46
Репутация: 1998
Ник в игре: Richard_Castle
Контактная информация:

Re: Анонс модификаций

Сообщение Eakwarp »

Enr1k писал(а):
Eakwarp писал(а):
Hirano писал(а):Варп ты бы создал тему на форуме пусть люди пишут заявки , сколько например у каждого опыта в этой сфере чё они сумеют сделать , и потом ты не пускай их в себе в огород , пусть тебе так помогают , в блокнотах печатают или где то там я не в курсе , и тебе скидывают , а тебе только засунуть это надо будет ... Я просто предложил , я знаю ты всё равно так не сделаешь (((
Я итак знаю всех людей, которые обладают достаточными навыками, среди постоянных игроков таковых нет.

Давайте так, вот вам допотопная система квестов валакаса, из нее намеренно убраны все комментарии, образца 2-х летней давности. Задача минимум, описать что и за что отвечает, как работает, с чем связано, какие имеет ограничения, найти все ошибки, досконально. Готовый текст - мне в личку, кто реально покажет знания, будем думать, что делать с вами дальше.
test  Ахтунг, 600 строк кода

Код: Выделить всё

enum squestinfo
{
	sqValid,
	sqStartUserID,
	sqQuestID,
	sqNpcID,
	sqNpcName[MAX_PLAYER_NAME],
	sqNpcSkinID,
	Float:sqNpcX,
	Float:sqNpcY,
	Float:sqNpcZ,
	Float:sqNpcRot,
	sqPrice,
	sqStartItem,// 0/1
	sqStartItemID,
	sqSteeps,
	sqName[64],
	sqText[2048],
	sqAnimUse,
	sqAnimLib[32],
	sqAnimName[32],
	sqRewardItem,
	sqRewardItemID,
	sqUseCheckpoints
}
new StartQuestInfo[8][squestinfo];
new Text3D:StartQuestLabel[sizeof(StartQuestInfo)];

enum metaquestinfo
{
	mqValid,
	mqQuestID,
	mqSteepID,//0-7
	mqNpcID,
	mqNpcName[MAX_PLAYER_NAME],
	mqNpcSkinID,
	Float:mqNpcX,
	Float:mqNpcY,
	Float:mqNpcZ,
	Float:mqNpcRot,
    mqTakeItem,// 0/1
    mqTakeItemID,
   	mqGiveItem,// 0/1
	mqGiveItemID,
	mqEndQuest,// 0/1
	mqText[2048],
	mqAnimUse,
	mqAnimLib[32],
	mqAnimName[32]
}
new MetaQuestInfo[sizeof(StartQuestInfo)][8][metaquestinfo];

new Text3D:MetaQuestLabel[sizeof(StartQuestInfo)][8];

new Quest[MAX_PLAYERS]=-1;//0-9
new Steep[MAX_PLAYERS]=-1;//0-7
stock QuestNPCConnect(p)
{
    new playername[32];
	GetPlayerName(p,playername,32);
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
			if(!strcmp(StartQuestInfo[n][sqNpcName],playername,true))
			{
				StartQuestInfo[n][sqNpcID]=p;
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
				    if(!strcmp(MetaQuestInfo[n][i][mqNpcName],playername,true))
				    {
						MetaQuestInfo[n][i][mqNpcID]=p;
						return 1;
					}
				}
			}
		}
	}
	return 1;
}

stock QuestNPCSetSpawn(p)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
	    if(StartQuestInfo[n][sqValid])
	    {
	        if(p==StartQuestInfo[n][sqNpcID])
	        {
	        	SetSpawnInfo(StartQuestInfo[n][sqNpcID], 0, StartQuestInfo[n][sqNpcSkinID],StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ], StartQuestInfo[n][sqNpcRot], 0, 0, 0, 0, 0, 0 );
				return 1;
			}
			for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
			{
			    if(MetaQuestInfo[n][i][mqValid])
			    {
			        if(p==MetaQuestInfo[n][i][mqNpcID])
		        	{
                        SetSpawnInfo(MetaQuestInfo[n][i][mqNpcID], 0,  MetaQuestInfo[n][i][mqNpcSkinID], MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ], MetaQuestInfo[n][i][mqNpcRot], 0, 0, 0, 0, 0, 0 );
						return 1;
		        	}
			    }
			}
		}
	}
	return 1;
}
stock LoadRandomQuests()
{
	new str[255];
    samp_mysql_query("SELECT id FROM quest");
	samp_mysql_store_result();
	new quests=samp_mysql_num_rows();
	if(quests==0)
	{
        print("Error, not quest");
		return 1;
	}
	else if(quests<=sizeof(StartQuestInfo))
	{
	    for(new i = 0; i < quests; i++)
		{
		    if(!LoadQuest(i,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
			#endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
            for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	else
	{
		for(new i = 0; i < sizeof(StartQuestInfo); i++)
		{
		    new bit1,bit2;
		    new rand;
		    while (bit1==1)
			{
	            bit2=0;
			    rand=random(quests);
	            for(new n = 0; n < i; n++)
				{
				    if(StartQuestInfo[n][sqQuestID]==rand)bit2=1;
				}
				if(bit2==0)bit1=1;
			}
		    if(!LoadQuest(rand,i))continue;
		    //загрузка данных из бд по указанному иду.
		    StartQuestInfo[i][sqNpcID]=FindValidID();//свободный ид с конца
		    #if defined CBOTS
		    CreateNPC(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqNpcName]);
		    SetSpawnInfo(StartQuestInfo[i][sqNpcID], 0, StartQuestInfo[i][sqNpcSkinID],StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ], StartQuestInfo[i][sqNpcRot], 0, 0, 0, 0, 0, 0 );
		    SpawnNPC(StartQuestInfo[i][sqNpcID]);
		    SetNPCFacingAngle(StartQuestInfo[i][sqNpcID], StartQuestInfo[i][sqNpcRot]);
		    SetNPCImpregnable(StartQuestInfo[i][sqNpcID],1);
		    #else
		    ConnectNPC(StartQuestInfo[i][sqNpcName],"stand");
		    #endif
		    format(str,sizeof(str),"%s[/say для разговора]",StartQuestInfo[i][sqNpcName]);
			StartQuestLabel[i] = CreateDynamic3DTextLabel(str,COLOR_WHITE,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
			if(StartQuestInfo[i][sqAnimUse])
		    {
                ApplyAnimation(StartQuestInfo[i][sqNpcID],StartQuestInfo[i][sqAnimLib],StartQuestInfo[i][sqAnimName],4.1,0,0,0,1,0);
		    }
			for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
            {
                if(!LoadSteep(StartQuestInfo[i][sqQuestID],b)) continue;
                MetaQuestInfo[i][b][mqNpcID]=FindValidID();
                #if defined CBOTS
                CreateNPC(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcName]);
                SetSpawnInfo(MetaQuestInfo[i][b][mqNpcID], 0,  MetaQuestInfo[i][b][mqNpcSkinID], MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ], MetaQuestInfo[i][b][mqNpcRot], 0, 0, 0, 0, 0, 0 );
				SpawnNPC(MetaQuestInfo[i][b][mqNpcID]);
				SetNPCFacingAngle(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqNpcRot]);
				SetNPCImpregnable(MetaQuestInfo[i][b][mqNpcID],1);
				#else
		    	ConnectNPC(MetaQuestInfo[i][b][mqNpcName],"stand");
				#endif
                format(str,sizeof(str),"%s[/say для разговора]",MetaQuestInfo[i][b][mqNpcName]);
				MetaQuestLabel[i][b] = CreateDynamic3DTextLabel(str,COLOR_WHITE,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]+1.0,15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1);
				if(MetaQuestInfo[i][b][mqAnimUse])
			    {
	                ApplyAnimation(MetaQuestInfo[i][b][mqNpcID],MetaQuestInfo[i][b][mqAnimLib],MetaQuestInfo[i][b][mqAnimName],4.1,0,0,0,1,0);
			    }
            }
		}
	}
	return 1;
}

stock LoadQuest(qid,idto)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM quest WHERE id = %d LIMIT 1", qid);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
		StartQuestInfo[idto][sqValid]=1;
		StartQuestInfo[idto][sqQuestID]=qid;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: strmid(StartQuestInfo[idto][sqNpcName], Field, 0, strlen(Field), 255);
		        case 2: StartQuestInfo[idto][sqNpcSkinID] = strval(Field);
				case 3: StartQuestInfo[idto][sqNpcX] = floatstr(Field);
				case 4: StartQuestInfo[idto][sqNpcY] = floatstr(Field);
				case 5: StartQuestInfo[idto][sqNpcZ] = floatstr(Field);
				case 6: StartQuestInfo[idto][sqNpcRot] = floatstr(Field);
				case 7: strmid(StartQuestInfo[idto][sqName], Field, 0, strlen(Field), 255);
				case 8: strmid(StartQuestInfo[idto][sqText], Field, 0, strlen(Field), 2048);
				case 9: StartQuestInfo[idto][sqPrice] = strval(Field);
				case 10: StartQuestInfo[idto][sqStartItem] = strval(Field);
				case 11: StartQuestInfo[idto][sqStartItemID] = strval(Field);
				case 12: StartQuestInfo[idto][sqSteeps] = strval(Field);
				case 13: StartQuestInfo[idto][sqAnimUse] = strval(Field);
				case 14: strmid(StartQuestInfo[idto][sqAnimLib], Field, 0, strlen(Field), 255);
				case 15: strmid(StartQuestInfo[idto][sqAnimName], Field, 0, strlen(Field), 255);
				case 16: StartQuestInfo[idto][sqRewardItem] = strval(Field);
				case 17: StartQuestInfo[idto][sqRewardItemID] = strval(Field);
				case 18: StartQuestInfo[idto][sqUseCheckpoints] = strval(Field);
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, quest %d - not loaded",qid);
	return 0;
}

stock LoadSteep(questid,steep)
{
	new query[255],Field[2048];
    format(query, sizeof(query), "SELECT * FROM questmeta WHERE QuestID=%d AND SteepID=%d LIMIT 1", questid,steep);
	samp_mysql_query(query);
	samp_mysql_store_result();
	if(samp_mysql_num_rows() != 0)
	{
		samp_mysql_fetch_result();
	//	samp_mysql_fetch_next(Field);
		new rcnt=0;
        MetaQuestInfo[questid][steep][mqValid]=1;
		while (samp_mysql_fetch_next(Field)==1)
		{
		    switch(rcnt)
		    {
		        case 1: MetaQuestInfo[questid][steep][mqQuestID]= strval(Field);
		        case 2: MetaQuestInfo[questid][steep][mqSteepID]= strval(Field);
		        case 3: strmid(MetaQuestInfo[questid][steep][mqNpcName], Field, 0, strlen(Field), 255);
		        case 4: MetaQuestInfo[questid][steep][mqNpcSkinID] = strval(Field);
		        case 5: MetaQuestInfo[questid][steep][mqNpcX] = floatstr(Field);
				case 6: MetaQuestInfo[questid][steep][mqNpcY] = floatstr(Field);
				case 7: MetaQuestInfo[questid][steep][mqNpcZ] = floatstr(Field);
				case 8: MetaQuestInfo[questid][steep][mqNpcRot] = floatstr(Field);
				case 9: MetaQuestInfo[questid][steep][mqTakeItem]= strval(Field);
				case 10: MetaQuestInfo[questid][steep][mqTakeItemID]= strval(Field);
				case 11:MetaQuestInfo[questid][steep][mqGiveItem]= strval(Field);
				case 12:MetaQuestInfo[questid][steep][mqGiveItemID]= strval(Field);
				case 13:MetaQuestInfo[questid][steep][mqEndQuest]= strval(Field);
				case 14:strmid(MetaQuestInfo[questid][steep][mqText], Field, 0, strlen(Field), 2048);
				case 15: MetaQuestInfo[questid][steep][mqAnimUse] = strval(Field);
				case 16: strmid(MetaQuestInfo[questid][steep][mqAnimLib], Field, 0, strlen(Field), 255);
				case 17: strmid(MetaQuestInfo[questid][steep][mqAnimName], Field, 0, strlen(Field), 255);
				
			}
			rcnt++;
		}
		return 1;
	}
	printf("Error, steep %d for quest %d - not loaded",steep,questid);
	return 0;
}

stock SayToQuestPlayer(playerid)
{
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[i][sqNpcX], StartQuestInfo[i][sqNpcY], StartQuestInfo[i][sqNpcZ]))
		{
		    if(Quest[playerid]==-1)//начать квест
			{
			    new query[255];
			    format(query,sizeof(query),"SELECT id FROM questcomplete WHERE Name='%s' AND QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[i][sqQuestID]);
				samp_mysql_query(query);
				samp_mysql_store_result();
				new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				if(samp_mysql_num_rows() != 0)
				{
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				}
				if(IsACop(playerid))return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
				Quest[playerid]=i;
			    ShowPlayerDialog(playerid,199,DIALOG_STYLE_MSGBOX,str,StartQuestInfo[i][sqText],"Взять","Не взять");
			    return 1;
		    }
		    else
		    {
		        new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
		        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
		    }
		}
		for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[i][b][mqNpcX], MetaQuestInfo[i][b][mqNpcY], MetaQuestInfo[i][b][mqNpcZ]))
			{
			    if(Quest[playerid]!=i)
			    {
    				new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
			        return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
			    if(Steep[playerid]==b)
			    {
					if(MetaQuestInfo[i][b][mqTakeItem])
					{
						if(FindItem(playerid,MetaQuestInfo[i][b][mqTakeItemID])) DeleteOneItem(playerid,MetaQuestInfo[i][b][mqTakeItemID]);
						else EndQuest(playerid,0);
					}
					new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
				    ShowPlayerDialog(playerid,200,DIALOG_STYLE_MSGBOX,str,MetaQuestInfo[i][b][mqText],"Ок","Ок");
				    return 1;
			    }
			    else
			    {
			        new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[i][sqName]);
					return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Прости, у меня для тебя ничего нет","Ок","Ок");
			    }
		    }
		}
	}
	return 1;
}
stock QuestDialogResponse(playerid, dialogid, response)
{
	switch(dialogid)
	{
	    case 199:
	    {
			if(response)
			{
			    if(StartQuestInfo[Quest[playerid]][sqStartItem])
				{
				    if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqStartItemID],1))
					{
					    new str[255];
						format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
						Quest[playerid]=-1;
						Steep[playerid]=-1;
					    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
					}
			    }
			    Steep[playerid]=0;
			    new str[255];
				format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
				{
					SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
			    }
			    return 1;
			}
			else
			{
			    Quest[playerid]=-1;
			}
	    }
		case 200:
		{
		    if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItem])
			{
			    if(!SetItem(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqGiveItemID],1))
				{
				    new str[255];
					format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
				    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			if(MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqEndQuest]) return EndQuest(playerid, 1);
			new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Steep[playerid]++;
			if(StartQuestInfo[Quest[playerid]][sqUseCheckpoints])
			{
				SetPlayerCheckpoint(playerid,MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcX], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcY], MetaQuestInfo[Quest[playerid]][Steep[playerid]][mqNpcZ],4.0);
			    return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"На вашем радаре отображен чекпоинт с указанным NPC.","OK","OK");
		    }
		    return 1;
		}
	}
	return 1;
}
stock EndQuest(playerid, type)
{
	switch(type)
	{
		case 0://провал
		{
		    new str[255];
		    DisablePlayerCheckpoint(playerid);
		    ClearQuestItems(playerid);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
			Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы провалили квест","Ок","Ок");
		}
		case 1://выигрыш
		{
		    new str[255];
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[playerid]][sqName]);
		    if(StartQuestInfo[Quest[playerid]][sqRewardItem])
		    {
		        if(!SetItem(playerid,StartQuestInfo[Quest[playerid]][sqRewardItemID],1))
		        {
		            return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Вы не сможете унести это, уберите что нибуть из своих вещей и подойдите ко мне снова.","OK","OK");
				}
		    }
			new str1[255];
			format(str1,sizeof(str1),"Вы прошли квест, награда %d",StartQuestInfo[Quest[playerid]][sqPrice]);
			new reason[255];
			format(reason,sizeof(reason),"Прошел квест %s",StartQuestInfo[Quest[playerid]][sqName]);
			DisablePlayerCheckpoint(playerid);
            TransferMoney(0,0,playerid,1,StartQuestInfo[Quest[playerid]][sqPrice],reason);
            new query[255];
            format(query,sizeof(query),"INSERT INTO questcomplete SET Name='%s', QuestID=%d",oGetPlayerName(playerid),StartQuestInfo[Quest[playerid]][sqQuestID]);
			samp_mysql_query(query);
            Quest[playerid]=-1;//0-9
			Steep[playerid]=-1;//0-7
			ClearQuestItems(playerid);
			return ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,str1,"Ок","Ок");
		}
	}
	return 1;
}
stock QuestPlayerConnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
stock QuestPlayerDisconnect(playerid)
{
    Quest[playerid]=-1;//0-9
	Steep[playerid]=-1;//0-7
	return 1;
}
enum equestinfo
{
	eqType,
	eqStage,
	eqQuest,
    eqText[2048]
};
new EditQuestInfo[MAX_PLAYERS][equestinfo];
stock StartEditTextForQuest(playerid)
{
    for(new n = 0; n < sizeof(StartQuestInfo); n++)
	{
		if(IsPlayerInRangeOfPoint(playerid,3.0,StartQuestInfo[n][sqNpcX], StartQuestInfo[n][sqNpcY], StartQuestInfo[n][sqNpcZ]))
		{
			new str[255];
			format(str,sizeof(str),"Изменение квеста %d, вы сейчас на старте, введите название:",n);
			format(EditQuestInfo[playerid][eqText],2048," ");
			EditQuestInfo[playerid][eqType]=-1;
			EditQuestInfo[playerid][eqQuest]=n;
			ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
			return 1;
		}
		for(new i = 0; i < StartQuestInfo[n][sqSteeps]; i++)
		{
		    if(IsPlayerInRangeOfPoint(playerid,3.0,MetaQuestInfo[n][i][mqNpcX], MetaQuestInfo[n][i][mqNpcY], MetaQuestInfo[n][i][mqNpcZ]))
			{
                EditQuestInfo[playerid][eqType]=1;
                EditQuestInfo[playerid][eqQuest]=n;
                EditQuestInfo[playerid][eqStage]=i;
                new str[255];
				format(str,sizeof(str),"Изменение квеста %d, этап %d",n,i);
				format(EditQuestInfo[playerid][eqText],2048," ");
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
				return 1;
			}
		}
	}
	return 0;
}
stock EditQuestDialogResponse(playerid, dialogid, response, inputtext[])
{
	switch(dialogid)
	{
	    case 221:
	    {
	        if(response)
	        {
	            new str[255];
	            switch(EditQuestInfo[playerid][eqType])
	            {
					case -1:
					{
						new query[255];
					    format(query,sizeof(query),"UPDATE quest SET Name=' %s' WHERE id=%d",inputtext,StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqName],64,"%s",inputtext);
						format(str,sizeof(str),"Изменение квеста %d, текст квеста:",EditQuestInfo[playerid][eqQuest]);
						format(EditQuestInfo[playerid][eqText],2048," ");
						EditQuestInfo[playerid][eqType]=0;
						ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
						return 1;
					}
	                case 0:format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					case 1:format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
	            }
				format(EditQuestInfo[playerid][eqText],2048," %s\n%s",EditQuestInfo[playerid][eqText],inputtext);
				ShowPlayerDialog(playerid,221,DIALOG_STYLE_INPUT,str,EditQuestInfo[playerid][eqText],"Добавить строку","Конец");
	        }
	        else
	        {
	            new str[255];
	            new query[2048];
	            switch(EditQuestInfo[playerid][eqType])
	            {
	                case 0:
					{
					    format(query,sizeof(query),"UPDATE quest SET QuestText='%s' WHERE id=%d",EditQuestInfo[playerid][eqText],StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqQuestID]);
					    samp_mysql_query(query);
					    format(StartQuestInfo[EditQuestInfo[playerid][eqQuest]][sqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					   	format(str,sizeof(str),"Изменение квеста %d",EditQuestInfo[playerid][eqQuest]);
					}
					case 1:
					{
					    format(query,sizeof(query),"UPDATE questmeta SET QuestText='%s' WHERE QuestID=%d AND SteepID=%d",EditQuestInfo[playerid][eqText],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqQuestID],MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqSteepID]);
					    samp_mysql_query(query);
					    format(MetaQuestInfo[EditQuestInfo[playerid][eqQuest]][EditQuestInfo[playerid][eqStage]][mqText],2048,"%s",EditQuestInfo[playerid][eqText]);
					    format(str,sizeof(str),"Изменение квеста %d, этап %d",EditQuestInfo[playerid][eqQuest],EditQuestInfo[playerid][eqStage]);
					}
	            }
	            ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,str,"Сохранено","Ок","Ок");
				return 1;
	        }
	    }
	}
	return 1;
}
stock UnloadQuests()
{
	foreach(Player,i)
	{
	    if(Quest[i]>=0)
		{
	    	new str[255];
		    DisablePlayerCheckpoint(i);
		    ClearQuestItems(i);
			format(str,sizeof(str),"Квест: %s",StartQuestInfo[Quest[i]][sqName]);
			Quest[i]=-1;//0-9
			Steep[i]=-1;//0-7
			return ShowPlayerDialog(i,0,DIALOG_STYLE_MSGBOX,str,"Квесты были выгружены, и ваше участие отменено","Ок","Ок");
	    }
	}
    for(new i = 0; i < sizeof(StartQuestInfo); i++)
	{
	    if(StartQuestInfo[i][sqValid])
	    {
	        #if defined CBOTS
	    	DestroyNPC(StartQuestInfo[i][sqNpcID]);
	    	#else
			Kick(StartQuestInfo[i][sqNpcID]);
			#endif
            DestroyDynamic3DTextLabel(StartQuestLabel[i]);
            StartQuestInfo[i][sqValid]=0;
	    	for(new b = 0; b < StartQuestInfo[i][sqSteeps]; b++)
	        {
	            if(MetaQuestInfo[i][b][mqValid])
	            {
	                #if defined CBOTS
	            	DestroyNPC(MetaQuestInfo[i][b][mqNpcID]);
	            	#else
					Kick(MetaQuestInfo[i][b][mqNpcID]);
	            	#endif
	            	DestroyDynamic3DTextLabel(MetaQuestLabel[i][b]);
	            	MetaQuestInfo[i][b][mqValid]=0;
	            }
        	}
        }
    }
	return 1;
}
Что-то не вижу я в том коде ошибок. Скомпилировалось по крайней мере без запинок)
Я разве сказал, что он не компилируемый?
test  Персонажи
Ричард Касл - богатый, престарелый холостяк, как следствие ведет довольно развязный образ жизни. Полиции известен как президент галактики крутотень.
Кейв Джонсон - политик, демократ, глава правительства штата Сан Андреас. Прислан в штат Вашингтоном. Из биографии известна его деятельность в Вирджинии и Юте. Несколько раз помогал Сан Андреас в критических политических ситуациях. В юности проживал в Техасе.
test  Важно к прочтению
Заявки на регистрацию проверяю сугубо в порядке общей очереди и по мере наличия на них свободного времени, убедительная просьба, не просить меня проверить вашу заявку.

Игровой уровень - ООС единица, какие к черту "лет в штате"? Одумайтесь.

Давайте, все уже окончательно уяснят, что Лос Сантос - это Лос Сантос, не Лос Анджелес, не Нью-Йорк (как думают "особо одаренные"), а Лос Сантос, выдуманный город. Туризмо - это туризмо, не феррари, не ваз 2106 и не та "ваша любимая машина", мод которой вы поставили взамен туризмо. У нас самобытный игровой мир, который зачастую бывает как крайне близок к реальности, так и в равной степени и крайне от нее далек.

Научитесь играть РП исходя из ООС ограничений, а не пытайтесь обойти ООС ограничения, аргументируя это своим РП. Направляя свой отыгрыш на пересечение этих рамок, вы будете лишь вызывать конфликты как с другими игроками, так и с администрацией.

Q: Никто не играет со мной больших РП, бытовуху играть не умею/ни хочу/не буду, ЧТО ДЕЛАТЬ?!?
A: Поставьте IC цель своему персонажу и ищите IC пути для ее достижения.
Вопреки распространенному мнению, я ненавижу банить людей.

С вами очень сложно.

Конвертирую плюсики в модификации.
РэK0zyavkka
Форумчанин
Сообщения: 420
Зарегистрирован: 18 апр 2012, 17:08
Репутация: -1
Ник в игре: Cody Cullen

Re: Анонс модификаций

Сообщение РэK0zyavkka »

Варп,в этом коде только,место где стоит бот,его скин,имя и прочее,так же стоит не большой диалог,команда say висит над головой вот стоит получение предмета,информация куда двигатся и чекпоинт,а да и получение денег в конце.. P s в личку лучше подробней напишу) когда весь кодтпросмотрю.
Изображение
Кому нужен,звоните :D
test  Cody Cullen
Справка о состоянии здоровья

Фамилия, Имя пациента: Коди Каллен
Возраст: 30
Пол: Мужской
Состояние здоровья: Отличное
Противопоказания: Не имеется

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Здоров

Врач: Никита Феррум.
Подпись: Ferrum0k
test  Jasper Kyd
PavelMas писал(а):
Справка о состоянии здоровья

Фамилия, Имя пациента: Jasper Kyd
Возраст: 32 года
Пол: Мужской
Состояние здоровья: Полностью здоров
Противопоказания: Не имеются

Лист показаний

Психолог: Здоров
Хирург: Здоров
Заключение врача: Полностью здоров

Врач: Pavel Maslennikov
Подпись: Maslennikov
Ответить

Вернуться в «Разработка»