-
Notifications
You must be signed in to change notification settings - Fork 8
/
client.lua
151 lines (135 loc) · 4.83 KB
/
client.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
_DEBUG = false
pedConvoLevel = 0
lastPed = 0
function DebugPrint(...)
if _DEBUG == true then
return print(...)
end
end
function prc(percentage)
local rand = math.random(0,100)
if rand > percentage then
return false
elseif rand <= percentage then
return true
end
end
convos = {
-- default
{
name = "default",
speech = {
"GENERIC_HI",
"GENERIC_HOWS_IT_GOING",
"CHAT_RESP",
"GENERIC_WHATEVER",
},
},
-- calm
{
name = "calm",
speech = {
"GENERIC_HOWS_IT_GOING",
"GENERIC_THANKS",
"GENERIC_BYE",
},
},
-- scared
{
name = "scared",
speech = {
--"GENERIC_BYE",
"GENERIC_CURSE_MED",
"GENERIC_CURSE_HIGH",
"GENERIC_FRIGHTENED_HIGH"
},
flee = true,
},
-- aggressive
{
name = "aggressive",
speech = {
"GENERIC_HI",
"GENERIC_WHATEVER",
--"CHAT_RESP",
--"GENERIC_FUCK_YOU",
"GENERIC_INSULT_MED",
"GENERIC_INSULT_HIGH"
},
attack = true,
},
}
pedConvo = convos[1]
CreateThread(function()
while true do
Wait(0)
repeat Wait(0) until MumbleIsPlayerTalking(PlayerId())
local startTime = GetGameTimer()
DebugPrint("started talking")
repeat Wait(0) until not MumbleIsPlayerTalking(PlayerId())
local endTime = GetGameTimer()
DebugPrint("no more talking")
local duration = endTime - startTime
DebugPrint("talk duration = "..duration)
if duration < 500 then
DebugPrint("duration too short")
else
Wait(math.random(200, 800))
local pool = GetGamePool("CPed")
for i,v in pairs(pool) do
if #(GetEntityCoords(v) - GetEntityCoords(PlayerPedId())) < 4.3 and v ~= PlayerPedId() and not IsPedAPlayer(v) then
if not IsPedDeadOrDying(v, 1) and not IsPedFleeing(v) and not IsPedInCurrentConversation(v) then
if not IsAnySpeechPlaying(v) then
if v == lastPed then
pedConvoLevel = math.min(pedConvoLevel + 1, #pedConvo.speech)
else
pedConvoLevel = 1
pedConvo = convos[math.random(1,#convos)]
DebugPrint(v, "chose convo", pedConvo.name)
end
-- local speech = "APOLOGY_NO_TROUBLE"
local speech = pedConvo.speech[pedConvoLevel]
if IsPedInCombat(v, PlayerPedId()) then
-- PlayPedAmbientSpeechNative(v, "GENERIC_INSULT_HIGH", "SPEECH_PARAMS_FORCE_NORMAL")
local speech = "GENERIC_INSULT_HIGH"
else
TaskLookAtEntity(v, PlayerPedId(), 3000, 2048, 3)
if pedConvoLevel == #pedConvo.speech then
DebugPrint("reached end of convo")
if pedConvo.attack then
-- couldn't figure out how to make random ped attack instead of flee
--DebugPrint("attacking")
--SetPedCombatAbility(v, 2)
--TaskCombatPed(v, PlayerPedId(), 0, 16)
elseif pedConvo.flee then
DebugPrint("fleeing")
TaskReactAndFleePed(v, PlayerPedId())
end
else
if prc(15) then
DebugPrint("15% chance passed, turning ped")
TaskTurnPedToFaceEntity(v, PlayerPedId(), 1000)
end
end
end
DebugPrint(v, "saying", speech)
PlayPedAmbientSpeechNative(v, speech, "SPEECH_PARAMS_FORCE_NORMAL")
TriggerServerEvent("pedchat:receiveSpeech", PedToNet(v), speech)
lastPed = v
end
end
end
end
end
end
end)
RegisterNetEvent("pedchat:sendSpeech")
AddEventHandler("pedchat:sendSpeech", function(player, ped, speech)
if player ~= GetPlayerServerId(PlayerId()) then
DebugPrint("Received", ped, speech)
local ped = NetToPed(ped)
if DoesEntityExist(ped) then
PlayPedAmbientSpeechNative(ped, speech, "SPEECH_PARAMS_FORCE_NORMAL")
end
end
end)