• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Camera Movment System like WoW

Status
Not open for further replies.
Level 4
Joined
Dec 11, 2007
Messages
74
So i modded a camera System that i found here ->>Klick<<-

with some more functions...:grin: [UPDATED]

  1. First u usually move with a,w,s,d..
  2. You can Look at you and turn the Camerea then you hold the left Mousebutton...
  3. Then you Hold the left & right mouse button You can walk like WoW ,turn with your mouse and so on...
  4. with the mouswheel you can change the distance to your char..
  5. with mouswheel + ctrl you can change the distance of what you can see
  6. with spacebar you can now JUMP :D...
  7. with tab you select the nearest enemy...
  8. with "t" you attack the selected not allied unit...
  9. with "F1" you select your HERO... :p

4. Some things that i need, i hope someone will make:
  1. A Jump System [Added, but it's shit you can jump through walls -.- it dissables pathing and it also had no animations^^]
  2. A Select the nearest Mob System (like wow with [TAB]) [ADDED]
    [*]A Wall Detect System or Something like this, cause i can go through walls, etc [Pathability Check ADDED]
    [*]A physic engine would be nice [Needed]
    [*]A swimming system [Needed]
    [*]A Castbar [Needed]
    [*]A system where you always have Selected your hero, but all abilitys and attacks not AoE's are casted on the Selected enemy (mybe you can also see the hp of this mob through a multiboard) [Needed]
    [/TAB]
[TAB]

v1.1
Removed the Bug with the running animation loop then you walk with the mousebuttons.
Added Nearest Enemy Selector [TAB]
Added A Jump System wich disables Pathing
Added a Pathability check
Added A attack order then you press "t"
Changed the look at you function so now you must press ctrl+ leftmousebutton

v1.2
Added A Max AoA and Rot so now you cant lock through the bottom
Changed the Range for the select nearest enemy from 750 to 1000

v1.3
Removed A bug with the walk animation for other units
Improved the Camera System so you can look now and spell skills
(thanks mindworx for your advancedcamera example =))[/TAB]
[TAB]


Here is the Code to Set the Unit:

JASS:
function Trig_init_cam_Actions takes nothing returns nothing
    call SetCamUnit( gg_unit_Hjai_0012 ) // Set the Unit
endfunction

//===========================================================================
function InitTrig_init_cam takes nothing returns nothing
    set gg_trg_init_cam = CreateTrigger(  )
    call TriggerAddAction( gg_trg_init_cam, function Trig_init_cam_Actions )
endfunction


And here the Movement System:
JASS:
function Jump_Exec takes nothing returns nothing
    local unit u = bj_groupRandomCurrentPick
    local real h = bj_enumDestructableRadius
    local real r = bj_lastTransmissionDuration
    call SetUnitPathing( u, false )
    call UnitAddAbility(u,'Amrf' )
    call UnitRemoveAbility(u,'Amrf')
    call SetUnitFlyHeight( u, h, r )
    call TriggerSleepAction(.1)
    call SetUnitFlyHeight( u, 0, r )
    call TriggerSleepAction(.01)
    call SetUnitPathing( u, true )
    call ForceKeyUp(32)
endfunction

library thirdpersoncam initializer init

globals
    private unit CurrentPick
    private real CenterX
    private real CenterY
    private real CurrentDistance
    private group AnyGroup = CreateGroup()

    private real cam_zoffset = 150.00
    private real cam_aoa     = 327.65
    private real cam_dist    = 500.00
    private real cam_farz    = 3000.00
    private real cam_angle   = 0.0
    
    private unit cam_unit
    //---
    private constant trigger trig_OnMouseLeftDown   = CreateTrigger()
    private constant trigger trig_OnMouseLeftUp     = CreateTrigger()
    private constant trigger trig_OnMouseRightDown  = CreateTrigger()
    private constant trigger trig_OnMouseRightUp    = CreateTrigger()
    private boolean bool_MouseLeftState             = false
    private boolean bool_MouseRightState            = false
    private constant trigger trig_OnMouseWheel      = CreateTrigger()
    private constant trigger trig_AoAControl        = CreateTrigger()
    
    private constant trigger trig_OnKeyDown         = CreateTrigger()
    private constant trigger trig_OnKeyUp           = CreateTrigger()
    
    private boolean array bool_KeyState
    
    private boolean bool_AoAChanging = false
    private integer int_AoAOffsetY = GetMouseY()
    private integer int_AoAOffsetX = GetMouseX()
endglobals

private function Enum takes nothing returns nothing
        local unit u = GetEnumUnit()
        local real dx = GetUnitX(u) - CenterX
        local real dy = GetUnitY(u) - CenterY
        local real d = (dx*dx + dy*dy) / 10000.
    if ( IsUnitAlly(GetEnumUnit(), GetOwningPlayer(cam_unit)) == false ) then
        if d < CurrentDistance then
            set CurrentDistance = d
            set CurrentPick = u
        endif
    endif
        set u = null
endfunction

function GetClosestUnitInRange takes real x, real y, real radius returns unit
        set CurrentPick = null
        set CenterX = x
        set CenterY = y
        set CurrentDistance = 100000
        call GroupEnumUnitsInRange(AnyGroup, x, y, radius, null)
        call ForGroup(AnyGroup, function Enum)
        return CurrentPick
endfunction

function Jump takes unit u, real height, real rate returns nothing
    set bj_enumDestructableRadius = height
    set bj_lastTransmissionDuration = rate
    set bj_groupRandomCurrentPick = u
    call ExecuteFunc( "Jump_Exec" )
endfunction

private function GetPointZ takes real x, real y returns real
    local location l = Location(x,y)
    local real h = GetLocationZ(l)
    call RemoveLocation(l)
    set l = null
    return h
endfunction

private function OnMouseLeftDown takes nothing returns nothing
    set bool_MouseLeftState = true
endfunction

private function OnMouseLeftUp takes nothing returns nothing
    set bool_MouseLeftState = false
    if not bool_MouseLeftState then
        call SetUnitAnimation(cam_unit, "stand")
        call SetUnitTimeScale(cam_unit, 1.0)
    endif
endfunction

private function OnMouseRightDown takes nothing returns nothing
    set bool_MouseRightState = true
endfunction
    
private function OnMouseRightUp takes nothing returns nothing
    set bool_MouseRightState    = false
    if not bool_MouseRightState then
        call SetUnitAnimation(cam_unit, "stand")
        call SetUnitTimeScale(cam_unit, 1.0)
    endif
endfunction

private function OnKeyDown takes nothing returns nothing
    set bool_KeyState[GetTriggerKey()]    = true
endfunction

private function OnKeyUp takes nothing returns nothing
    set bool_KeyState[GetTriggerKey()]    = false
    if not bool_KeyState[65] and not bool_KeyState[68] and not bool_KeyState[87] and not bool_KeyState[83] or bool_KeyState[32] then
        call SetUnitAnimation(cam_unit, "stand")
        call SetUnitTimeScale(cam_unit, 1.0)
    endif
endfunction

function GetMouseLeftState takes nothing returns boolean
    return bool_MouseLeftState
endfunction

function GetMouseRightState takes nothing returns boolean
    return bool_MouseRightState
endfunction

function GetKeyState takes integer key returns boolean
    return bool_KeyState[key]
endfunction

//=== Zooming
private function OnMouseWheel takes nothing returns nothing
    local integer WheelDelta   = GetTriggerWheelDelta()
    if GetKeyState(17) then
        set cam_farz = cam_farz - WheelDelta
        if cam_farz > 4500 then
            set cam_farz = 4500
        endif
    else
        set cam_dist = cam_dist - WheelDelta
        if cam_dist > 1150 then
            set cam_dist = 1150
        endif
    endif
endfunction

private function CameraControl takes nothing returns nothing
    local real offset = 0
    
    local real move_x = 0
    local real move_y = 0
    
    local real r
    local real m = 1.5
    set bool_AoAChanging = true
    
    if GetMouseRightState() and GetMouseLeftState() then
        call SetUnitFacing(cam_unit, cam_angle)
        call SetUnitAnimation(cam_unit, "walk")
        call SetUnitTimeScale(cam_unit, 1.0)
        set m = 1.5
        set move_x = move_x + CosBJ(cam_angle) 
        set move_y = move_y + SinBJ(cam_angle)
    endif
    
    if GetKeyState(9) then
        call GetClosestUnitInRange(GetUnitX(cam_unit), GetUnitY(cam_unit), 1000)
        call SelectUnitForPlayerSingle(CurrentPick, GetOwningPlayer(cam_unit))
    endif
    
    if GetKeyState(32) then
        call Jump(cam_unit, 70, 450)
    endif
    
    if GetKeyState(84) then
        call IssueTargetOrder(cam_unit, "attack", GroupPickRandomUnit(GetUnitsSelectedAll(GetOwningPlayer(cam_unit))))
        call DestroyGroup(GetLastCreatedGroup())
    endif
    
    if GetKeyState(65) then
        call SetUnitFacing(cam_unit, cam_angle)
        call SetUnitAnimation(cam_unit, "walk")
        call SetUnitTimeScale(cam_unit, 1.0)
        set move_x = move_x + CosBJ(cam_angle+45)
        set move_y = move_y + SinBJ(cam_angle+45)
        set m = 1.0
    endif
    if GetKeyState(68) then
        call SetUnitFacing(cam_unit, cam_angle)
        call SetUnitAnimation(cam_unit, "walk")
        call SetUnitTimeScale(cam_unit, 1.0)
        set move_x = move_x - 0.5*CosBJ(cam_angle+45)
        set move_y = move_y - 0.5*SinBJ(cam_angle+45)
        set m = 1.0
    endif
    if GetKeyState(87) then
        call SetUnitFacing(cam_unit, cam_angle)
        call SetUnitAnimation(cam_unit, "walk")
        call SetUnitTimeScale(cam_unit, 1.0)
        set m = 1.5
        set move_x = move_x + CosBJ(cam_angle)
        set move_y = move_y + SinBJ(cam_angle)
    endif
    if GetKeyState(83) then
    call SetUnitFacing(cam_unit, cam_angle)
        call SetUnitAnimation(cam_unit, "walk")
        call SetUnitTimeScale(cam_unit, -0.5)
        set move_x = move_x - CosBJ(cam_angle)
        set move_y = move_y - SinBJ(cam_angle)
        set m = 0.8
    endif
    
    set r = SquareRoot(move_x*move_x + move_y*move_y)
    if r > 0 then
        set move_x = move_x / r
        set move_y = move_y / r
    endif

    if (not GetMouseRightState() and not GetMouseLeftState()) or (not GetMouseLeftState() and not GetKeyState(17)) then
        set bool_AoAChanging = false
        set int_AoAOffsetY = GetMouseY()
        set int_AoAOffsetX = GetMouseX()
        set cam_aoa = cam_aoa
        set cam_angle = cam_angle
    endif    

    if IsTerrainPathable((GetUnitX(cam_unit) + move_x * 0.01 * GetUnitMoveSpeed(cam_unit) * m), (GetUnitY(cam_unit) + move_y * 0.01 * GetUnitMoveSpeed(cam_unit) * m), PATHING_TYPE_WALKABILITY) and not GetKeyState(32) then
        call SetUnitX(cam_unit, GetUnitX(cam_unit))
        call SetUnitY(cam_unit, GetUnitY(cam_unit))
    else
        call SetUnitX(cam_unit, GetUnitX(cam_unit) + move_x * 0.01 * GetUnitMoveSpeed(cam_unit) * m)
        call SetUnitY(cam_unit, GetUnitY(cam_unit) + move_y * 0.01 * GetUnitMoveSpeed(cam_unit) * m)  
    endif

        if(bool_AoAChanging) then
            set offset = (int_AoAOffsetY - GetMouseY())
            set cam_aoa = cam_aoa + offset
            set int_AoAOffsetY = GetMouseY()
        endif
        if(cam_aoa > 350) then
            set cam_aoa = 350
        endif
        if(cam_aoa < 240) then
            set cam_aoa= 240
        endif
        if(bool_AoAChanging) then
            set offset = (int_AoAOffsetX - GetMouseX())
            set cam_angle = cam_angle + offset
            set int_AoAOffsetX = GetMouseX()
        endif
        if(cam_angle > 360) then
            set cam_angle = cam_angle - 360
        endif
        if(cam_angle < 0) then
            set cam_angle = cam_angle + 360
        endif
    
    call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, cam_aoa, 0.00)
    call SetCameraField(CAMERA_FIELD_ROTATION, cam_angle, 0.00)
    call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, cam_dist, 0.3)
    call SetCameraField(CAMERA_FIELD_FARZ, cam_farz, 0.3)
    call SetCameraField( CAMERA_FIELD_ZOFFSET, GetCameraField( CAMERA_FIELD_ZOFFSET ) + ( GetPointZ(GetUnitX(cam_unit),GetUnitY(cam_unit)) + 150 - GetCameraTargetPositionZ() ), 0.01 )
endfunction

function SetCamUnit takes unit u returns nothing
    call SetCameraTargetController(u, 0, 0, false)
    
    
    call SetCameraField(CAMERA_FIELD_ROTATION, GetUnitFacing(u), 1.0)
    
    set cam_unit = u
endfunction

private function init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEvent(t, 0.01, true)
    call TriggerAddAction(t, function CameraControl)
    call TriggerRegisterMouseEvent(trig_OnMouseLeftDown, EVENT_LMOUSEDOWN)
    call TriggerAddAction(trig_OnMouseLeftDown, function OnMouseLeftDown)
    call TriggerRegisterMouseEvent(trig_OnMouseLeftUp, EVENT_LMOUSEUP)
    call TriggerAddAction(trig_OnMouseLeftUp, function OnMouseLeftUp)
    call TriggerRegisterMouseEvent(trig_OnMouseRightDown, EVENT_RMOUSEDOWN)
    call TriggerAddAction(trig_OnMouseRightDown, function OnMouseRightDown)
    call TriggerRegisterMouseEvent(trig_OnMouseRightUp, EVENT_RMOUSEUP)
    call TriggerAddAction(trig_OnMouseRightUp, function OnMouseRightUp)
    call TriggerRegisterMouseEvent(trig_OnMouseWheel, EVENT_MOUSEWHEEL)
    call TriggerAddAction(trig_OnMouseWheel, function OnMouseWheel)
    call TriggerRegisterKeyEvent(trig_OnKeyDown, 1)
    call TriggerAddAction(trig_OnKeyDown, function OnKeyDown)
    call TriggerRegisterKeyEvent(trig_OnKeyUp, 0)
    call TriggerAddAction(trig_OnKeyUp, function OnKeyUp)
endfunction

endlibrary

So Sry for my bad english.. and i hope someone will like it ^^[/tab][/tab]
 

Attachments

  • terrain2_0057xxxxxxx.w3x
    506.2 KB · Views: 917
Last edited:
Level 4
Joined
Dec 11, 2007
Messages
74
mhm to open it you need jass new gen pack and to play you need rtc o_O so on my computer, i installed warcraft 3 twice :con:
 
Level 4
Joined
Dec 11, 2007
Messages
74
yes but then i installed jassnewgen and rtc in the same warcraft 3 folder, i wasnt able to play any map... so i installed it twice...

mhmm i dont know why you can't test it X_x...
i have frozenthrone 1.21b + rtc and i can play ...

sry but i don´t know why you can't play it
 
Level 21
Joined
Aug 3, 2004
Messages
710
Very nice system. Rep for you. :) This system should become more popular once the next installment of RtC is released. It's almost ready, and working with the newest version of warcraft 3.

EDIT:
To make a jump system, just examine some other jump system, and implement it so it jumps on pressing space.
To make a tab system, you just need to group the units around the unit to a certain range, and then pick one when pressing tab.
Wall detection is harder, but there is a system Vexorian made, that detects if a point is walkable, tho i don't think it's fast enough to be used with this system.
 
Level 4
Joined
Dec 11, 2007
Messages
74
yes i know :p mhm but im new in jass , i started now after i found rtc :D ^^ yes because of that, and so i need a little bit help but then i have time i think i will get it.

EDIT: So pathabillity check is added =)
 

Attachments

  • A New Morning.w3n
    1.8 MB · Views: 337
Last edited:
Level 4
Joined
Jun 25, 2008
Messages
67
Ahh i really wanna test this, it sounds so good... i have a problem tho... i have jass newgen and rtc installed... i also have patch 1.21b.. and i cant test it... it just goes to the Frozen Throne Main Menu??? whats happening?
 
Level 3
Joined
Aug 11, 2006
Messages
43
I already make jump system here. This jump is work with noise terrain
 

Attachments

  • Real jump and shot rrow.w3x
    105.3 KB · Views: 305
Level 4
Joined
Dec 11, 2007
Messages
74
Nightmare- :

mhm i think newgen is not compatible with rtc X_x have you installed warcraft 3 twice ones with rtc and once with newgen???

scvn80:

I cant play your mapsystem, dunno why >_<


NEW UPDATE AND SOME MORE FUNCTIONS =)
 
Last edited:
Level 4
Joined
Dec 11, 2007
Messages
74
RtC ehhm, ist the programm with some new added api's here :D the "Reinventing the Craft"

mhm give some other hotkeys to the spells^^
 
Level 4
Joined
Dec 11, 2007
Messages
74
yeah but reinventing the craft enables this feature^^ with all keys :p

here look -->> Klick
 

Attachments

  • A New Morning.w3n
    38.9 MB · Views: 235
Last edited:
Level 4
Joined
Jun 25, 2008
Messages
67
>but the main should be that with rtc and the copy with newgen
Ok, I did that, I patched up to 1.22, installed RtC, clicked the RtC.exe, so it rolled my wc3.exe back to 1.21.1.6300. I tried the launcher with the Contest Entry, and it said wc3.exe had a problem and needed to close. Also is it bad that when RtC folder installed it came with NewGen inside it?
 
Level 4
Joined
Jun 25, 2008
Messages
67
>mhm yes you should then you cant start any map
Alright, hope you not getting annoyed from me :(, i hope you not, but im sorry anyway. Well this is hopefully the last question, but i reinstalled wc3, now its at Patch 1.07. How should i update it to 1.21? Because when i start Bnet it opens up the patch and makes it go to 1.22. Should i try and find something on the internet?
After this works for me, ill try your map, and give you suggestions :)
 
Level 4
Joined
Jun 25, 2008
Messages
67
Thnx so much MindWorX :), it works now=D.
Ok I have tested it, and I love it, here's a few suggestions and comments though :D

- Maybe a way to select your hero at all times, for example when you have the unit targeted it will somehow show your hero like in WoW
- Jump is good, but as you know you there is that pathability check that becomes disabled
- What would be cool, but I don't think it would be a possibility, is adding a spell system like WoW, with actionbars, One way I think you would be able to do this would be: Like Heroes.. they have the icon, and that could instead be a spell actionbar.
- The tab to select enemy is great, and the right click for atk is also great!

This is amazing! Thats all i can think of right now, ill try and give some more feedback later :)
 
Level 4
Joined
Dec 11, 2007
Messages
74
mhm yeah but first i will make some improvments to the camera system

- hmm with the hero selectione you can create a multiboard with life/mana/exp...
- With the jump system I have some problems i want to make it so that you can jump over
little obejcts but not through walls >_<
-actionbar with hero's yes but this system was for my orpg and so i wont make it
but then you wish i will^^ but i think it would be better then you can select the skill in a multiboard and map a key to it =)
(mhm but one question, "skills have hotkeys why dou you need actionbars?")
- it think a catsbar would be great


do you know something about a swimming system? or should i make one
i thought about a death animation then the char is in water =)



EDIT: Improved the Camera System test pls :D
 

Attachments

  • A New Morning.w3n
    40.4 MB · Views: 300
Last edited:
Level 4
Joined
Jun 25, 2008
Messages
67
Ok, i just tested the camera system. I love it, except there's a few bugs with the animations where it shows up weird. The moving backwards is nice, and the part were you don't have to hold down ctrl to look around is good. My only complaint is that I personally don't like how it moves diagonal when pressing a or d. It should just turn like before. And it just looks weird with the animation.

-About the actionbar, yea, its true that you dont need it with hotkeys. But it still would be pretty cool, but probably a waste of time.

-Castbar? as in when channeling it shows when its done? If so, there's one here on the hive (could be improved a LOT though) For example, instead of | it would be nice to be a whole bar. And to not float above the unit, to be centered in the bottom of the screen.
Trigger - Casting Time Bar - The Hive Workshop - A Warcraft III Modding Site (Requires WEU)
http://www.hiveworkshop.com/forums/resource.php?t=103559&prev=search=casting&d=list&r=20 (Another One, Although it Suxxx)

-I love the swimming idea, that would be amazing, the idea i thought of before about that, would be a separate map and you create a underwater effect.. but idk.

-Yeah i know what you mean about the jump, you want it like WoW, but that might be hard, I'm not rly sure what to do that, maybe you could ask MindWorX or someone else.

-That hero selection idea could possible work, but idk, ill try and think more about it.

-A simple idea for hotkeys for spells and so you can configure the hotkeys also could be:
When a player types -hotkeys, it will open up a list of spells you have in a dialog or multibar, then after that it shows all available keys to pick from. Then each time you press that key, it will start the spell on selected unit even when your unit isn't selected. And -displayhotkeys (to show bound keys) -clearhotkeys (to clear all keys/specific chosen spell)

EDIT: If you want to check this out, its a WoW Revive System, its pretty good, although it has leaks, and GUI.
http://www.hiveworkshop.com/forums/resource.php?t=103739&prev=search=WoW&d=list&r=20&t=65
The things I suggest to add to that would be
- Instead of Grave the hero set to animation: death, somewhat transparent, invincible and no damage.
- Shows no units when in Ghost form
- Greyed Screen when in Ghost form
I'll add these if you want later when I have time =], give me anymore ideas if you got some^^
http://www.hiveworkshop.com/forums/resource.php?t=103729&prev=search=Revive&d=list&r=20&t=65 (Ok here's another, this one is better in many ways, but lack some others, i'll combine these two later)
 
Last edited:
Level 4
Joined
Dec 11, 2007
Messages
74
mhm yeah so then i only need a good inventory system and one to mount on units :p then i have all^^ -.-

but i need a lil bot more time cause i have not really much expierence in jass
 
Level 4
Joined
Dec 11, 2007
Messages
74
Nightmare:


Here Your old movmentsystem + Now you can select a unit with tab and the unit has a grreen circle around it ^^ and then you now cast blizzard it will automatically order the unit to cast blizzard on this unit :p
 

Attachments

  • terrain2_0057xxxxxxx.w3x
    507.8 KB · Views: 227
Level 4
Joined
Jun 25, 2008
Messages
67
Thnx :), ohh wow, the mount system is pretty hard acually.. well if you want a decent one. If you want a ordinary one, like the hippogryph with archer, just change the models, simple. Ill try and come up with a better one tho.
Another idea would be use the metamorph spell, but it still wont be as good=\

EDIT: Tested, pretty nice, there could be some fixes, but i'll do that... i really need to learn JASS tho, im sooo lazy tho haha.

Btw: Heres another jump you might like it
http://www.hiveworkshop.com/forums/f413/vjass-jump-51294/

Anyway, where did you learn JASS, i should check it out =)
 
Last edited:
Level 2
Joined
Mar 13, 2005
Messages
11
Can you make it so that camera is blocked by terrain and objects? That way you wont see through objects or be able to. However trees and things which are too common shouldn't block ;p Looks nice.
There is a system for "cast bar" but probably can't access atm since wc3c is down, however since you are learning I suppose you could just dev one yourself :D Use stacked floatboxes with text or so. Not sure how it works, haven't looked into much JASS yet. Will need to start reading tuts. Night :)
 
Level 4
Joined
Dec 11, 2007
Messages
74
mhm i think a camera system blocked by terrain and object is acctually really really hard :p 4me i think it's impossible...

2. my warcraft had a bug and now i must wait for my friend to reinstall it, he has the cd's =/
 
Last edited:
Level 4
Joined
Dec 11, 2007
Messages
74
mhmm now i have new a problem but i won't open a new thread so i write here :

Then i Import any Camera system in my campaign even the example in the tutorials section i cant load my map -.- and i dunno why because it's a campaign?
 
Level 2
Joined
Apr 15, 2009
Messages
9
I'm new at this.... uh,..... where do i put your codes and such on the unit i want to me camera lol because I don't see instructions where to put and what to click like object manager or what?
 
Status
Not open for further replies.
Top