Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Zeno

Members
  • Posts

    289
  • Joined

  • Last visited

    Never

Everything posted by Zeno

  1. Animegirl, Would love to help. Really not enough information… Here are some questions to guide and help you. What engine are you using? (This should _always_ be mentioned in any support-related posts) Does the engine support sprite changes at character creation? In server/data/classes.ini are there multiple sprites listed, usually separated by a comma for your class? Are there enough sprites in the client/data files/gfx/characters folder?
  2. I think it was removed on purpose… Hopefully not because of bugs. ![;)](http://www.touchofdeathforums.com/community/public/style_emoticons//wink.png) This is all client-side. To re-enable clicking as well, in modInput remove certain comments as below: Sub HandleMouseDown ``` Case GUI_SPELLS Spells_MouseDown Button mouseState = GUI_SPELLS If Button = vbRightButton Then mouseClicked = True Exit Sub 'Case GUI_MENU ' Menu_MouseDown Button ' Exit Sub Case GUI_HOTBAR Hotbar_MouseDown Button Exit Sub ``` Sub HandleMouseUp ``` Case GUI_SPELLS Spells_MouseUp mouseClicked = False 'Case GUI_MENU ' Menu_MouseUp Case GUI_HOTBAR Hotbar_MouseUp ``` That should be all it takes. Edit: @escfoe2: This could very easily have an options check in the config.ini. I prefer the clean UI too, but seems a little contentious. Tiny feature for a future version? Be a couple if statements, and a simple chkButtons in the options menu where you'd also need to render or remove the GUI, depending on the case, when changed.
  3. Zeno

    My question's thread

    ~~DX11 should be fine. It contains the core files of 10 and 9, and IIRC 9 is backwards compatible even past 6\. So in short DX11 is backwards compatible (for most applications)~~ Really, Serenade? I thought the 9 core was fine for running 8\. :S But yeah, installing 8 is the best for an 8 program.
  4. Awesome! Have you experimented with flattening several layered balls before smudging? Could look even more realistic.
  5. You said in the original post you don't have VB6 so I'm totally wasting my time. All the same, look for this under modGraphics (sounds like a good place to start eh) ``` ScreenWidth = 800 ScreenHeight = 600 ``` Now for what you won't know how to do… Please not that you will also have to change how many tiles are shown on-screen, the default rendering position of the menus and static GUI pieces such as chat, and possibly update any click subs to conform to the higher resolution. Good luck, Chuck. My point is this: if you don't even know what VB6 _is_, this is probably over your head. If none of this is making any sense to you, you may want to start with a much simpler code change. That or use an engine that already supports a larger/changeable resolution. There are closed source versions for those who don't want to program.
  6. Zeno

    My question's thread

    Are you hosting it? IP=localhost You can also try Googling "what is my IP" if you'd like others to be able to login.
  7. > So if he has any problems you think he should just give up? Seems like pretty bad advice. You misunderstand. Perhaps I'm not being clear. I mean if you open the source in VB6 and an error message immediately pops up (to do with run-time files, licensing, etc.) you should address those problems before continuing. OP mentioned ignoring a boot error while loading source.
  8. Zeno

    What is vb6?

    _You can easily torrent VB6._ Microsoft will hardly come after you for pirating an unsupported relic. If you're serious about learning, don't bother with free or portable versions. They're likely to hinder your progress. Go for the enterprise edition.
  9. > There's a [french section on this forum](http://www.touchofdeathforums.com/community/index.php?/forum/35-francais/). You might be more comfortable there. dl56, je pense que tu ne recevra pas d'aide par ici car tu n'as pas bien expliqué ce que tu cherche en anglais. Si tu écris tes idées et besoins dans la section française du forum dont Matthew t'a donné un link, je t'aiderai à faire une système de rang à l’occasion que ça soit assez simple.
  10. Possible hardware issue… Has this only been happening recently where it was working before?
  11. Iman7, it sounds like you don't know how to program in VB6 and are not particularly interested in learning. Working with Eclipse is a great opportunity to learn VB6; however, it is not required. The portable version of VB6 is garbage and has never worked for me. The free version is a useless joke. Either get a proper full version (enterprise edition) of VB6 or stick to closed source. "Closed source" refers to engines which are already compiled and do not include source files - in other words, perfect for beginners. If you'd like to try open source, get VB6 by torrent (one of the only ways since Microsoft no longer supports it). If you open the server or client in VB6 and an error message pops up, you should not continue as you will run into problems. Make sure you are running the server as an administrator. Shelf the idea of VB6 for a bit and just try the .EXE files. If you suspect corrupted NPC files, a quick check is to move all NPCs in the server to another folder (say "/server/data/npcs/backup") and rebooting the server, which will recreate fresh empty NPC files. If you still get errors, the problem is in the source code. You can restore your npcs back into their original folder and seek help (or another engine). It's good to be cautious. Based on your situation, your only liability is personal information, and you should never transfer account files when transferring a server, unless it's to a permanent server host. There are those here with hundreds of posts who still can't figure out what all the map attributes do, much less debug a subscript out of range, and might actually pull some petty content theft on you. Conversely, I've been here off and on for seven years (more off than on, but nine years if we include Mirage) and have the expertise needed to help you, but also the newbie rank. I'm probably not alone in that. Post count is a fool's yardstick for trust.
  12. The tiles are also rendered in DX8\. You'll need to do the same. I think all the GFX are. (Can't imagine the engine uses both D3D8 and DD7… would be so silly)
  13. Zeno

    2 Questions

    All npcs move randomly except shopkeeper and attack on sight. No attacking npcs are static, unless surrounded on 4 sides by npc avoid attributes. On the second question, do you mean a single NPC can give you several quests in order (finishing one quest unlocks another)? You will either need an engine with a switch system or need to install the code yourself. If this is what you want, please search around the forums using the search term "switches". I will warn you that it is much more complicated. What Abhi has suggested would work and is much easier, but would allow you to accept all of the quests at once.
  14. Sounds like [background=rgb(248, 248, 248)]Call ClearMapNpcs [/background]is what's making your pets disappear. IMO, Pets are essentially equipment. They're like a glorified paperdoll piece with a mind of their own. They look like NPCs, but they're not. When they're coded differently from NPCs, they aren't influenced by ClearMapNPCs. I second the recommendation for a separate sub for pet-related spawning. I'd extend this to removing pets, pets moving, etc. For pet functions (if they talk randomly, attack, etc.), those can be done in existing subs. If you pets have commands (e.g.: come/wander/attack/sit/spin-on-the-spot) those should be separate subs. You mentioned that you are using a petrec. Also be sure you have the type in both client and server side in modTypes. Any editing of an existing type (e.g. map types) must be done exactly mirrored between server and client. Given the problem you're having and a lack of information, it is possible that the data is being stored offset by one or several lines, which is how tcp packets are impacted by modTypes not being parallel between client and server. I strongly recommend that pets be stored under playerrec (e.g. pets as petrec) and _not_ in mapdata except perhaps as a temporary npc slot. By this I don't mean an extra NPC, I mean an information slot to store only the most basic aspects of pets to make sure there map isn't swarmed with pets. If the pets are stored in playerrec, that information stored in mapdata should probably be the petowner's index. This would allow an easy index to the player in all events related to both the map and the player. In the end pets are tied to the player, and only superficially to the map. Have you consulted Lightning's pet tutorial for more information? It is not, as titled, completely bug free, but nonetheless a great source of understanding for how pets can (should?) work in this engine.
  15. Oh, I forgot one. So, just for kicks, _spells_. If you want player AGI to impact spell cooldown, it's the same deal in another place. **Server-side** under Sub CastSpell in modCombat, find``` If DidCast Then Call SetPlayerVital(index, Vitals.MP, GetPlayerVital(index, Vitals.MP) - MPCost) Call SendVital(index, Vitals.MP) ' send vitals to party if in one If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index TempPlayer(index).SpellCD(spellslot) = GetTickCount + (Spell(spellnum).CDTime * 1000) Call SendCooldown(index, spellslot) SendActionMsg mapnum, Trim$(Spell(spellnum).Name) & "!", BrightRed, ACTIONMSG_SCROLL, GetPlayerX(index) * 32, GetPlayerY(index) * 32 End If ``` replace with something like``` If DidCast Then Call SetPlayerVital(index, Vitals.MP, GetPlayerVital(index, Vitals.MP) - MPCost) Call SendVital(index, Vitals.MP) ' send vitals to party if in one If TempPlayer(index).inParty > 0 Then SendPartyVitals TempPlayer(index).inParty, index TempPlayer(index).SpellCD(spellslot) = GetTickCount + ((Spell(spellnum).CDTime - GetPlayerStat(Index,Agility)) * 1000) Call SendCooldown(index, spellslot) SendActionMsg mapnum, Trim$(Spell(spellnum).Name) & "!", BrightRed, ACTIONMSG_SCROLL, GetPlayerX(index) * 32, GetPlayerY(index) * 32 End If ``` Here again "- GetPlayerStat(Index,Agility)" is inserted to lower the timer by 1 ms per agility point _per second of cooldown_. So a character with 25 agi casting a spell with a 5sec cooldown will see a 125ms reduction in the cooldown timer. A 100 AGI character casting a 1.5 second spell will see a 150ms reduction. A 150 AGI character casting a 3s spell will see a 450ms reduction. And so on. Now **client-side** to allow them to send casts quicker, change ``` If PlayerSpells(spellSlot) > 0 Then If GetTickCount > Player(MyIndex).AttackTimer + 1000 Then If Player(MyIndex).Moving = 0 Then Set buffer = New clsBuffer buffer.WriteLong CCast buffer.WriteLong spellSlot SendData buffer.ToArray() Set buffer = Nothing SpellBuffer = spellSlot SpellBufferTimer = GetTickCount Else Call AddText("Cannot cast while walking!", BrightRed) End If End If Else Call AddText("No spell here.", BrightRed) End If ``` to something like``` If PlayerSpells(spellSlot) > 0 Then If GetTickCount > Player(MyIndex).AttackTimer + 1000 - GetPlayerStat(Index,Agility) Then If Player(MyIndex).Moving = 0 Then Set buffer = New clsBuffer buffer.WriteLong CCast buffer.WriteLong spellSlot SendData buffer.ToArray() Set buffer = Nothing SpellBuffer = spellSlot SpellBufferTimer = GetTickCount Else Call AddText("Cannot cast while walking!", BrightRed) End If End If Else Call AddText("No spell here.", BrightRed) End If ``` Again at 1ms per agi. This is essentially the spell-side version of Sub CheckAttack(). If, for example, your spell cooldown is at 900ms (say with 100AGI) and you can only cast one spell a second, it's kind of pointless, so you need to change this too. Any other cooldown-related timer (icon, permissions) should be handled by the variable SpellCD got in client-side Sub HandleCooldown, which you get from server-side Sub SendCooldown. I don't think you should change these. If you want AGI to influence spell casting time… **server-side** under Sub ServerLoop in modServerLoop, change``` If TempPlayer(i).spellBuffer.Spell > 0 Then If GetTickCount > TempPlayer(i).spellBuffer.Timer + (Spell(Player(i).Spell(TempPlayer(i).spellBuffer.Spell)).CastTime * 1000) Then CastSpell i, TempPlayer(i).spellBuffer.Spell, TempPlayer(i).spellBuffer.target, TempPlayer(i).spellBuffer.tType TempPlayer(i).spellBuffer.Spell = 0 TempPlayer(i).spellBuffer.Timer = 0 TempPlayer(i).spellBuffer.target = 0 TempPlayer(i).spellBuffer.tType = 0 End If End If ``` to something like``` If TempPlayer(i).spellBuffer.Spell > 0 Then If GetTickCount > TempPlayer(i).spellBuffer.Timer + ((Spell(Player(i).Spell(TempPlayer(i).spellBuffer.Spell)).CastTime - GetPlayerStat(i, Agility))* 1000) Then CastSpell i, TempPlayer(i).spellBuffer.Spell, TempPlayer(i).spellBuffer.target, TempPlayer(i).spellBuffer.tType TempPlayer(i).spellBuffer.Spell = 0 TempPlayer(i).spellBuffer.Timer = 0 TempPlayer(i).spellBuffer.target = 0 TempPlayer(i).spellBuffer.tType = 0 End If End If ``` Then adjust the **client-side** timer under modGameLoop``` ' check if we need to unlock the player's spell casting restriction If SpellBuffer > 0 Then If SpellBufferTimer + (Spell(PlayerSpells(SpellBuffer)).CastTime * 1000) < tick Then SpellBuffer = 0 SpellBufferTimer = 0 End If End If ``` to something like ``` ' check if we need to unlock the player's spell casting restriction If SpellBuffer > 0 Then If SpellBufferTimer + ((Spell(PlayerSpells(SpellBuffer)).CastTime - GetPlayerStat(i, Agility)) * 1000) < tick Then SpellBuffer = 0 SpellBufferTimer = 0 End If End If ``` To adjust the graphics **client-side**, find this under modGraphics``` ' calculate the width to fill barWidth = (GetTickCount - SpellBufferTimer) / ((Spell(PlayerSpells(SpellBuffer)).CastTime * 1000)) * sWidth ``` and replace with something like``` ' calculate the width to fill barWidth = (GetTickCount - SpellBufferTimer) / (((Spell(PlayerSpells(SpellBuffer)).CastTime - GetPlayerStat(MyIndex,Agility)) * 1000)) * sWidth ``` That will adjust the spell-casting bar. The actual animations of spell casting are handled between server and client. Here again, previous variable changes should be enough and you should not edit the relevant subs in modHandleData, modClientTCP, or modServerTCP. So there you have it! Experiment with the formula. Try to keep it balanced. Use the same formula for each type (one formula for all attacks; one formula for all spells). Have fun! **DISCLAIMER:** Kindly note that I haven't actually tested these codes. All I did was add in GetPlayerStat(#,Agility) with appropriate algebra. Also where that coding was done in a forum post and not in VB6, it's possible that I made syntax errors such as a small typo or forgetting a bracket. It is also possible that I goofed up and used the wrong index (e.g. MyIndex where I needed Index, Index instead of I, etc.). I did try to be careful though, and while I'm pretty sure there's no need to debug, I'm not 100% positive. At any rate, those mistakes should be an easy debug. Let me know if it works out. If there are any errors, post them and I will update my posts so others can benefit from working code.
  16. Zhavier, Assuming walk speed? "Faster" is fairly ambiguous. Here's some code, and I'll explore attack speed after. If you haven't found the tutorial, it's quite simple. Search for the following **client-side** under modConstants``` ' Check if player is walking, and if so process moving them over Select Case Player(Index).Moving Case MOVING_WALKING: MovementSpeed = ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X)) Case MOVING_RUNNING: MovementSpeed = ((ElapsedTime / 1000) * (RUN_SPEED * SIZE_X)) Case Else: Exit Sub End Select ``` Where you see WALK_SPEED * SIZE_X and RUN_SPEED * SIZE_X use some algebra involving GetPlayerStat(Index, Agility). Note that the default walk speed is 4, run speed is 6, and anything past 12 seems to become buggy in certain situations. Since twelve is very fast I recommend it or something slightly lower as your upper limit for your formula. For example: ``` ' Check if player is walking, and if so process moving them over Select Case Player(Index).Moving dim m as long m = (GetPlayerStat(Index, Agility) + 180 / 200) If m < 1 Then m = 1 If m > 2 Then m = 2 Case MOVING_WALKING: MovementSpeed = ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X) * m) Case MOVING_RUNNING: MovementSpeed = ((ElapsedTime / 1000) * (RUN_SPEED * SIZE_X) * m) Case Else: Exit Sub End Select ``` The Dim m As Long should be moved to the top of the Sub. This should fluctuate movement speed between 4-8/6-12 for walk/run based on agility. The formula up there will begin increasing speed at 20 agility and max out at 220, when it doubles walk and run speed. Each point in agility should increase movement speed by .5%, but I'm not sure if you'd see it gradual or in steps. Play around with it. You want a formula with an input of player agility and an output between 1 and 2. As a side note, I always found it funny that you can do client-side this to player speed. Try to do this to NPC speed and it's like a strange game of hopscotch or chicken-walk. Ah the difference ServerLoop makes. Now, if you meant faster in terms of, say, attack speed… _**Server-side**_ under Sub CanPlayerAttackNPC change ``` ' attack speed from weapon If GetPlayerEquipment(attacker, weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(attacker, weapon)).speed Else attackspeed = 1000 End If ``` to something like ``` ' attack speed from weapon If GetPlayerEquipment(attacker, weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(attacker, weapon)).speed - GetPlayerStat(attacker,Agility) Else attackspeed = 1000 - GetPlayerStat(attacker,Agility) End If ``` To make your attack speed 1ms faster per AGI. You may want to increase. Although with AGI already having huge benefits in-game, you could easily make it imbalanced. In Sub CanPlayerAttackPlayer ``` If Not IsSpell Then ' Check attack timer If GetPlayerEquipment(attacker, weapon) > 0 Then If GetTickCount < TempPlayer(attacker).AttackTimer + Item(GetPlayerEquipment(attacker, weapon)).speed Then Exit Function Else If GetTickCount < TempPlayer(attacker).AttackTimer + 1000 Then Exit Function End If End If ``` to something like``` If Not IsSpell Then ' Check attack timer If GetPlayerEquipment(attacker, weapon) > 0 Then If GetTickCount < TempPlayer(attacker).AttackTimer + Item(GetPlayerEquipment(attacker, weapon)).speed - GetPlayerStat(attacker,Agility) Then Exit Function Else If GetTickCount < TempPlayer(attacker).AttackTimer + 1000 - GetPlayerStat(attacker,Agility) Then Exit Function End If End If ``` As above, 1ms per agi - but this time against players. _**Client-side**_ in modGameLogic's Sub CheckAttack ``` ' speed from weapon If GetPlayerEquipment(MyIndex, Weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(MyIndex, Weapon)).speed Else attackspeed = AttTimeNoWep End If ``` to something like ``` ' speed from weapon If GetPlayerEquipment(MyIndex, Weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(MyIndex, Weapon)).speed - GetPlayerStat(MyIndex, Agility) Else attackspeed = AttTimeNoWep - GetPlayerStat(MyIndex, Agility) End If ``` This will line up your attack checks with your changed attack speed. The changes here should mirror those in the server's CanAttack subs. If they don't, the timers won't line up and you might actually be slower. Womp. And in Sub DrawPlayer ``` ' speed from weapon If GetPlayerEquipment(Index, Weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(Index, Weapon)).speed Else attackspeed = 1000 End If ``` to something like``` ' speed from weapon If GetPlayerEquipment(Index, Weapon) > 0 Then attackspeed = Item(GetPlayerEquipment(Index, Weapon)).speed - GetPlayerStat(Index,Agility) Else attackspeed = 1000 - GetPlayerStat(Index,Agility) End If ``` So that the graphics updates the attack speed too. This should also match the other formulas, and again is here at 1ms per agi.
  17. Zeno

    Cases

    Scripted spell cases. Find Sub ScriptedSpells. When you make a scripted spell, the script# is the case# in the code. Basically, you can make a spell do anything (within reason) if you code it in there. This is how most people do "skills". Alternatively, use the hotkeys sub's cases to do by hitting a specified key as opposed to casting a specified spell.
  18. How does your sub look? The following works: ``` Sub OnMapLoad(Index, OldMap, NewMap) Call SaveCharInfo(Index) End Sub ``` When I use that in conjunction with your sub, it updates the ini each time I load a map. Is there something else in your OnMapLoad sub that might be making it not work?
  19. @Adrian: Using & "" is a common practice to avoid errors. If you have a Sub Name(Index, Variable) and use Call PutVar("filename.ini", "header", "label", Variable) it will not work. In that case, you need Call PutVar("filename.ini", "header", "label", Variable & ""). This only happens when the variable is one from the subname. @Dastyruck: Before you were using Sub SaveCharInfo(Index). To activate the sub, you need a Call SaveCharInfo(Index) at some point in your main.txt. Where are you actually using that call in your main txt? I'm looking for something like a scripted tile, spell, command, npc that initializes the actual savecharinfo function.
  20. Tested, and that all works. What about the part of your script that triggers it, using Call SaveCharInfo(Index)?
  21. Dastyruck, the problem does not lie in the single line of code. It works. What context is the call in? The error must lie in the code that triggers the Call. For example, this works within the commands sub: ``` Case "/check" Call PutVar("mailsystem\" & GetPlayerName(index) & ".ini", "Info", "Class", GetPlayerClassName(index)) Exit Sub ```
  22. Sure. The following code will set the player's permanent death toggle to 1 when the player dies. It will then kick the player, telling him that she or he died. When the player joins the game, it will kick the player and give a message that the player is dead. When a player makes a new character, that slot's death toggle is set off. When a player dies in an arena map, the player's death toggle is not set to 1. This takes 3 subs: ``` ' Executes on death, dropping all of the players items. Sub DropItems(Index) Call PutVar("accounts\" & GetPlayerLogin(index) & "_Info.ini", "Char" & GetPlayerCharNum(Index), "Dead", 1) If GetPlayerWeaponSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerWeaponSlot(Index), 0) End If If GetPlayerArmorSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerArmorSlot(Index), 0) End If If GetPlayerHelmetSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerHelmetSlot(Index), 0) End If If GetPlayerShieldSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerShieldSlot(Index), 0) End If If GetPlayerLegsSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerLegsSlot(Index), 0) End If If GetPlayerRingSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerRingSlot(Index), 0) End If If GetPlayerNecklaceSlot(Index) > 0 Then Call PlayerMapDropItem(Index, GetPlayerNecklaceSlot(Index), 0) End If Call AlertMsg(Index, "You have died!") End Sub ``` ``` ' Executes when a player logs into the game. Sub JoinGame(Index) If GetVar("accounts\" & GetPlayerLogin(index) & "_Info.ini", "Char" & GetPlayerCharNum(Index), "Dead") = 1 Then Call AlertMsg(Index, "You are dead!") End If If GetPlayerAccess(Index) = 0 Then Call GlobalMsg(GetPlayerName(Index) & " has joined " & GameName & "!", GREY) Else Call GlobalMsg("Administrator " & GetPlayerName(Index) & " has joined " & GameName & "!", YELLOW) End If Call PlayerMsg(Index, "Welcome to " & GameName & "!", WHITE) If LenB(MOTD) 0 Then Call PlayerMsg(Index, "MOTD: " & MOTD, BRIGHTCYAN) End If Call SendWhosOnline(Index) End Sub ``` ``` ' Executes when a new character is created. Sub OnNewChar(Index, CharNum) Call PutVar("accounts\" & GetPlayerLogin(index) & "_Info.ini", "Char" & GetPlayerCharNum(Index), "Dead", 0) End Sub ```
  23. Also for #6 if it's stored client-side the player can switch the number to give themselves whatever sprite they want. For both tiles: (This one was posted a few posts back. How you're doing this tile effects the other tile) Changes the sprite (you still need to set the sprite number) ``` Case 0 Call PutVar("\Scripts\charextras\"&GetPlayerName(Index)&".ini","Sprite","normal",GetPlayerSprite(Index)) Call SetPlayerSprite(Index, sprite#) Call PlayerWarp(Index, GetPlayerMap(Index), GetPlayerX(Index), GetPlayerY(Index)) Exit Sub ``` Sets the player's Sprite back to the original: ``` Case 1 Call SetPlayerSprite(Index, GetVar("\Scripts\charextras\"&GetPlayerName(Index)&".ini","Sprite","normal")) Exit Sub ```
  24. Well… Your trigger is Call SetTimer("tmrTest " & index & ",0", 5000) You can change the 5000 to any duration you would like, _in miliseconds_. It is set to 5 seconds right now. The tutorial says to use a scripted tile for when you enter a map. The tile would trigger a timer which would start the NPC casting the spell. Then, in the OnNPCDeath sub you add a Call RemoveTimer to stop the NPC from casting. The flaw with this is that only the first NPC on the map will cast. Alternatively, put it in Sub PlayerHit with a check for the NPC number to begin the casting when an NPC hits you. _Do not_ put it in scripted NPCs because then you can not attack them, and they will not directly attack you. The part of the code you posted goes into Sub tmrTest under Case 0. Everyone seems to use this sub for timers, which is frustrating since it assumes the script's user also happened to be using the exact same sub for their timers. You will have to add in the sub, and the title of a sub is case-sensitive is a timer is to be used. @Warconn: The original Main.txt does not include a Sub tmrTest. This sub was made by Baron to keep timers organized, and **is absolutely not a required sub to use timers**. He probably won't be able to find that sub in his main.txt because it might not be in his main.txt. I'm going to assume you're using Baron's main.txt. Don't forget that it's different.
  25. Create the mailsystem folder first, then it will work. @Adrian: Having just checked I assure you that without the folder, it will not create any file.
×
×
  • Create New...