Jump to content

Wolfenstein

Administrators
  • Content count

    441
  • Joined

  • Last visited

  • Days Won

    17

Wolfenstein last won the day on January 24 2017

Wolfenstein had the most liked content!

Community Reputation

172 Revered

About Wolfenstein

  • Rank
    PTE supervisor

Profile Information

  • Gender
    Not Telling

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Wolfenstein

    Legendary Tmog Possibilty !

    Client blocks it from what I remember.
  2. Wolfenstein

    Netherwing porting

    Sure, a lot of it will be ported later after Netherwing releases.
  3. Wolfenstein

    [Ragnaros] Molten Elementals

    We have different flags_extra than TC. As far as I'm concerned, we don't have a way to set knockback immunity using DB.
  4. Don't worry, we're gamers ourselves and we dislike the idea of "pay to win" as much as everyone else. It's not going to change.
  5. Wolfenstein

    [7385][Spell] Priest T12 4P

    It seems that we have proc data for it in DB, so just UPDATE `spell_proc_event` SET `Cooldown`=45 WHERE `entry`=99135; will suffice.
  6. Wolfenstein

    Serverside warrior changes questions.

    They're just bug fixes. We don't make our own balance changes to PvP.
  7. Wolfenstein

    nobody ques for 10-14 ever

    The difference between level 10 and 19 is huge compared to previous expansions, that's why Blizz changed the brackets.. Unfortunately you level so quickly in Cata, that there's no point in doing BGs (at least at those low levels).     There's no ideal solution to this I'm afraid.
  8. Wolfenstein

    [Answered] Regarding the PvP Season Rewards

    The pool of teams playing Rated BGs is a bit too small for titles, but we can maybe think of a different reward for top teams.
  9. Hello, After reading some of the comments and after a bit of consideration, we realized that the way we handled the PvP Season rewards situation was not an ideal one. We also know, that our communication with the players was far from perfect, and from how it looked like during our humble beginnings over four years ago. There are a number of reasons for that change, but what's important is that we have always had the server's best interest in mind, even if it sometimes required acting against community's general opinion. Obviously, after so many years of running this server it's much more difficult to gain satisfaction and enjoyment from the things we do, but we can assure everyone, that we still care deeply about the project, about its future, and we still spend so much time managing the server, that most of the people would consider it insane. We want this topic to be a good start for improving our communication with You, the players, by giving You an opportunity to provide suggestions for alternative PvP season rewards, for people who already have achieved the rank of Ruthless Gladiator before. So please, post your ideas below and we will try to select the one option which suits everyone the most. Atlantiss Team
  10. Applications are reviewed by both me and Ranor, we send invites on a weekly basis.     Ranor already gave you the answer, I see no reason to continue this topic.
  11. Wolfenstein

    [7938][4938][Quest] The Dark Missive ,Roadway Plans

    It can't be fixed this way, as it will lead to > 100% total drop chances for mobs. It needs to be put in a different loot group.
  12. In this tutorial, we will create a simple NPC script executed after turning a quest in. Imagine we got a quest from an npc called Farmer John. He asks us to gather and deliver 5 apples to him. After the quest, he expresses his gratitude and waves us goodbye. Let's start by creating the base of the script. The most used types of AI used are ScriptedAI and BossAI (which is derived from ScriptedAI). Since Farmer John is not a boss (yet?), ScriptedAI will do just fine. class npc_farmer_john : public CreatureScript { public: npc_farmer_john() : CreatureScript("npc_farmer_john") { } CreatureAI* GetAI(Creature* pCreature) const override { return new npc_farmer_johnAI(pCreature); } struct npc_farmer_johnAI: public ScriptedAI { npc_farmer_johnAI(Creature* c) : ScriptedAI(c) { } }; }; We want our script to be executed when we turn in a quest. To achieve this, we can use sQuestReward method: class npc_farmer_john : public CreatureScript { public: npc_farmer_john() : CreatureScript("npc_farmer_john") { } CreatureAI* GetAI(Creature* pCreature) const override { return new npc_farmer_johnAI(pCreature); } struct npc_farmer_johnAI: public ScriptedAI { npc_farmer_johnAI(Creature* c) : ScriptedAI(c) { } void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) override { } }; }; If Farmer John offers more than one quest, our event will be executed after each of them (we don't want that to happen, do we?). Let's fix this, by creating an enum for Farmer John: enum eFarmerJohn { QUEST_DELIVER_APPLES = xxxxx, // Id of our quest (from wowhead/quest_template) }; You should always put things like spell Ids, quest Ids and npc Ids in enums. It makes scripts much more clean and readable. Now, let's modify our sQuestReward method: void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (quest->GetQuestId() == QUEST_DELIVER_APPLES) { } } Something is still not right. What will happen if two (or more) people turn in the quest at the same time? I don't think Farmer John can handle multitasking well, so let's save him by making it impossible to start the event if it's already in progress: enum eFarmerJohn { QUEST_DELIVER_APPLES = xxxxx, // Id of our quest (from wowhead/quest_template) }; class npc_farmer_john : public CreatureScript { public: npc_farmer_john() : CreatureScript("npc_farmer_john") { } CreatureAI* GetAI(Creature* pCreature) const override { return new npc_farmer_johnAI(pCreature); } struct npc_farmer_johnAI : public ScriptedAI { npc_farmer_johnAI(Creature* c) : ScriptedAI(c) { } bool applesEventInProgress; // Reset() is executed when the creature respawns or when it returns to its home position after evade // Most variables will have their values set here void Reset() override { applesEventInProgress = false; // Event should not be in progress by default } void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (!applesEventInProgress && quest->GetQuestId() == QUEST_DELIVER_APPLES) // Check for both questId and if event is already in progress { applesEventInProgress = true; // Event is now in progress, it cannot be launched again until 'applesEventInProgress' is false } } }; }; We can finally get to making the event itself. There are multiple ways to handle timed actions, and in this tutorial we'll be using EventMap: struct npc_farmer_johnAI : public ScriptedAI { npc_farmer_johnAI(Creature* c) : ScriptedAI(c) { } EventMap events; // Our EventMap will be called 'events' bool applesEventInProgress; void Reset() override { applesEventInProgress = false; events.Reset(); // Removes all scheduled events and resets EventMap's time and phase } void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (!applesEventInProgress && quest->GetQuestId() == QUEST_DELIVER_APPLES) { applesEventInProgress = true; } } // Main AI function, called every map update (diff) // All timed events will be handled here void UpdateAI(uint32 diff) override { events.Update(diff); // Updates the time in our EventMap // All events which can be executed at the current time will be handled here while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { } } } }; We want our Farmer to say two texts - the first one 2 seconds after turning in the quest, and the second one 5 seconds later. Then, 6 seconds after the second quest, the Farmer will wave to us and that will be the end of our event. Let's add those events to our enum first: enum eFarmerJohn { QUEST_DELIVER_APPLES = xxxxx, EVENT_FARMER_TEXT_1 = 1, EVENT_FARMER_TEXT_2 = 2, EVENT_FARMER_EMOTE = 3 }; Now those actions need to actually be executed. Our event should start when we turn in the quest, so let's modify sQuestReward method again: void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (!applesEventInProgress && quest->GetQuestId() == QUEST_DELIVER_APPLES) { applesEventInProgress = true; events.ScheduleEvent(EVENT_FARMER_TEXT_1, 2000); // Schedule our first event to be executed 2000ms (2 seconds) from now } } We need to add those events in UpdateAI as well: void UpdateAI(uint32 diff) override { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FARMER_TEXT_1: events.ScheduleEvent(EVENT_FARMER_TEXT_2, 5000); // Second text should be 5000ms (5 sec) after this one break; case EVENT_FARMER_TEXT_2: events.ScheduleEvent(EVENT_FARMER_EMOTE, 6000); // Schedule an emote to be executed 6 seconds later break; case EVENT_FARMER_EMOTE: applesEventInProgress = false; // Our event has ended, it can be enabled again break; } } } Our events will now be properly executed, but they still don't do anything. We can correct the emote event right off the bat: case EVENT_FARMER_EMOTE: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); // Displays a "Wave" emote applesEventInProgress = false; break; But to make the Farmer say anything, we need to add his texts to the database: SET @FARMERJOHN := xxxxx; -- Farmer John\'s ID DELETE FROM `creature_text` WHERE `entry`[email protected]; INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES (@FARMERJOHN, 0, 0, 'Thanks to your help, my kids won''t starve!', 12, 0, 100, 5, 0, 0, 'Farmer John'), (@FARMERJOHN, 1, 0, 'I hope you''ll find some time to visit me again.', 12, 0, 100, 1, 0, 0, 'Farmer John'); Add the texts to our enum as well: enum eFarmerJohn { QUEST_DELIVER_APPLES = xxxxx, EVENT_FARMER_TEXT_1 = 1, EVENT_FARMER_TEXT_2 = 2, EVENT_FARMER_EMOTE = 3, TEXT_FARMER_GRATITUDE = 0, TEXT_FARMER_VISIT_AGAIN = 1 }; We have our texts ready, so we can finally finish the event: void UpdateAI(uint32 diff) override { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FARMER_TEXT_1: Talk(TEXT_FARMER_GRATITUDE); // Displays the first text events.ScheduleEvent(EVENT_FARMER_TEXT_2, 5000); break; case EVENT_FARMER_TEXT_2: Talk(TEXT_FARMER_VISIT_AGAIN); // Displays the second text events.ScheduleEvent(EVENT_FARMER_EMOTE, 6000); break; case EVENT_FARMER_EMOTE: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); applesEventInProgress = false; break; } } } Full script: -- SQL SET @FARMERJOHN := xxxxx; DELETE FROM `creature_text` WHERE `entry`[email protected]; INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES (@FARMERJOHN, 0, 0, 'Thanks to your help, my kids won''t starve!', 12, 0, 100, 5, 0, 0, 'Farmer John'), (@FARMERJOHN, 1, 0, 'I hope you''ll find some time to visit me again.', 12, 0, 100, 1, 0, 0, 'Farmer John'); // C++ enum eFarmerJohn { QUEST_DELIVER_APPLES = xxxxx, EVENT_FARMER_TEXT_1 = 1, EVENT_FARMER_TEXT_2 = 2, EVENT_FARMER_EMOTE = 3, TEXT_FARMER_GRATITUDE = 0, TEXT_FARMER_VISIT_AGAIN = 1 }; class npc_farmer_john : public CreatureScript { public: npc_farmer_john() : CreatureScript("npc_farmer_john") { } CreatureAI* GetAI(Creature* pCreature) const override { return new npc_farmer_johnAI(pCreature); } struct npc_farmer_johnAI : public ScriptedAI { npc_farmer_johnAI(Creature* c) : ScriptedAI(c) { } EventMap events; bool applesEventInProgress; void Reset() override { applesEventInProgress = false; events.Reset(); } void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override { if (!applesEventInProgress && quest->GetQuestId() == QUEST_DELIVER_APPLES) { applesEventInProgress = true; events.ScheduleEvent(EVENT_FARMER_TEXT_1, 2000); } } void UpdateAI(uint32 diff) override { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_FARMER_TEXT_1: Talk(TEXT_FARMER_GRATITUDE); events.ScheduleEvent(EVENT_FARMER_TEXT_2, 5000); break; case EVENT_FARMER_TEXT_2: Talk(TEXT_FARMER_VISIT_AGAIN); events.ScheduleEvent(EVENT_FARMER_EMOTE, 6000); break; case EVENT_FARMER_EMOTE: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); applesEventInProgress = false; break; } } } }; }; Edit: Apparently the forum doesn't display long codes properly. God damn it.
  13. Wolfenstein

    [NPC] Frostmaul Giant/Preserver/Tumbler

    UPDATE creature_template SET type_flags = type_flags | 512 WHERE entry IN (7428, 7429, 50258);
  14. Wolfenstein

    [Item] Cub's First Toy

    This looks much better, trust me.
  15. Wolfenstein

    Problems with Sniffing

    Not really, proper offsets must be found.
×